2016-02-02 46 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

这样做!感谢您的帮助,特别是关于提出正确问题的漫长过程。 (; –