2016-02-02 82 views
0

我想通過VBScript將一些.csv文件中的數據導入MS Access數據庫。將.csv導入MS Access。 「AtEndOfStream」不讀取最後一行

Sub CSVImport 
    connStr = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=P:\somedatabase.accdb" 

    'Define object type 
    Set objConn  = CreateObject("ADODB.Connection") 
    Set objRecordSet = CreateObject("ADODB.Recordset") 

    'Open Connection 
    objConn.open connStr 

    objRecordSet.Open "SELECT * FROM SomeTable", _ 
    objConn, adOpenStatic, adLockOptimistic 

    Set objFSO = CreateObject("Scripting.FileSystemObject") 

    Set objFile = objFSO.OpenTextFile("P:\someFile.csv") 

    Do Until objFile.AtEndOfStream 
    strVKBL_Stamm = objFile.ReadLine 
    arrVKBL_Stamm = Split(strVKBL_Stamm, ";") 
    objRecordSet.AddNew 

    objRecordSet("FirstName") = arrVKBL_Stamm(0) 
    objRecordSet("LastName") = arrVKBL_Stamm(1) 
    objRecordSet("Date")  = arrVKBL_Stamm(...) 
    objRecordSet("Type")  = arrVKBL_Stamm(11) 
    Loop 

    Set objRecordSet = Nothing 
    Set objFSO = Nothing 
    Set objFile = Nothing 
    Set objConn = Nothing 
End Sub 

這個腳本獲取所有數據從我的CSV文件,但它確實錯過了最後一道防線。當我在.csv結尾處打回兩次(一次不足)時,我的所有數據都會被導入。

我的備份計劃是將AtEndOfStream位更改爲類似

If arrVKBL_Stamm(0) = 0 Then 
    Exit Do 

,並添加一個零到文件中。問題是,.csv是從SAP導出的報告(這是 - afaik - 無法導出到MS Access本身),因此該部分需要另一個腳本或必須手動完成。

有沒有人有線索或給我一個提示如何解決這個問題?

+0

您發佈的代碼會引發錯誤,不僅是因爲缺少'End Sub',而是因爲您試圖修改已關閉的記錄集。請顯示您的實際代碼。 –

+0

增加了其餘的,不知道這是否澄清事情。但我希望如此。 :) –

+1

你的代碼仍然無法工作。你永遠不會打開一個文件,你永遠不會在'objRecordSet'中添加一條新記錄。 [mcve] – Andre

回答

3

我試過這段代碼:

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile("D:\myfile.csv", 1) 

Do Until objFile.AtEndOfStream 
    S = objFile.ReadLine 
    Debug.Print S 
Loop 
objFile.Close 

在VBA和它印所有行我的CSV文件,即使最後一行不以CRLF結束。

我很確定原因是:您的objRecordSet.AddNew缺少objRecordSet.Update

顯然,如果您在先前的.AddNew之後撥打.AddNew,則仍保存上一條記錄。

objRecordSet.AddNew後面跟着Set objRecordSet = Nothing不保存最後一條記錄。

解決方案:將objRecordSet.Update添加爲循環中的最後一個命令。

+0

這樣做!感謝您的幫助,特別是關於提出正確問題的漫長過程。 (; –