2017-07-19 107 views
1

我從來沒有使用過Access VBA,但我需要創建一個模塊來解析txt文件,然後立即將它導入到表中。在Access VBA中解析txt文件

的TXT的簡單化下是這樣的:

15686541 

468469 

48978965 

456287 

48666545 

45684651 

456788 

我需要爲了解析它

  1. 刪除所有行/行不六個字符
  2. 在第三個和第五個字符後加逗號

最終的結果是類似於:

468,46,9 

456,28,7 

456,78,8 

所有這些都必須在Access VBA模塊中完成,以便導入過程變得無縫。

非常感謝!

很抱歉打擾

+1

我建議將文本文件導入到臨時表中,然後可以輕鬆地通過一個SQL查詢完成所有轉換。它會比使用VBA循環記錄更快地工作。 –

回答

2

此功能會做到這一點 - 而且速度非常快:

Public Function ImportLog(ByVal Filename As String) As Long 

    Dim rs  As DAO.Recordset 

    Dim File As Integer 
    Dim Data As String 
    Dim Data6 As String 
    Dim Records As Long 

    Set rs = CurrentDb.OpenRecordset("Select Top 1 * From YourTableName") 

    File = FreeFile() 
    Open Filename For Input As #File 

    While Not EOF(File) 
     Line Input #File, Data 
     If Len(Data) = 6 Then 
      Data6 = Space(6 + 2) ' Space for six digits and two commas. 
      ' Build field value. 
      Mid(Data6, 1, 3) = Mid(Data, 1, 3) 
      Mid(Data6, 4, 1) = "," 
      Mid(Data6, 5, 2) = Mid(Data, 4, 2) 
      Mid(Data6, 7, 1) = "," 
      Mid(Data6, 8, 1) = Mid(Data, 6, 1) 
      rs.AddNew 
       ' Adjust "Data" to your field name. 
       rs.Fields("Data").Value = Data6 
      rs.Update 
      Records = Records + 1 
     End If 
    Wend 
    Close #File 
    rs.Close 

    Set rs = Nothing 

    ImportLog = Records 

End Function 

返回值是添加記錄的計數。

+1

[Mid Statement](https://msdn.microsoft.com/zh-cn/vba/language-reference-vba/articles/mid-statement)。該死的。這是否永遠存在?我從來沒有注意到這一點,只有看似相關的'LSet'和'RSet'。 – Andre

+1

是的,它非常古老。而且速度也非常快。對於小字符串來說,這並不重要,但對於大字符串xx K,如果可以避免並置,則會產生很大的差異。另外,代碼通常更清晰(=更易於閱讀)。 – Gustav

+0

*更容易閱讀*,但只有在閱讀'Mid(Data6,1,3)= Mid(Data,1,3)':)時才能通過WTF'「 – Andre

0

試試這個:

Sub Import() 
    Dim fileNum As Integer 
    Dim dataLine As String 
    Dim column1 As String 
    Dim column2 As String 
    Dim column3 As String 

    fileNum = FreeFile() 
    Open "Filename.txt" For Input As #fileNum 

    While Not EOF(fileNum) 
     Line Input #fileNum, dataLine 
     If Len(dataLine) = 6 Then 
      column1 = Mid(dataLine, 1, 3) 
      column2 = Mid(dataLine, 4, 2) 
      column3 = Mid(dataLine, 6, 1) 
      CurrentDb.Execute "INSERT INTO YourTable(Column1, Column2, Column3) VALUES('" & column1 & "', '" & column2 & "', '" & column3 & "')" 
     End If 
    Wend 

    Close #fileNum 
End Sub