将.csv导入MS Access。 “AtEndOfStream”无法读取最后一行

时间:2016-02-02 17:42:29

标签: vba csv ms-access vbscript

我想通过VBScript将.csv文件中的一些数据导入MS Access数据库。

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本身),因此该部分需要另一个脚本或者必须手工完成。

有没有人有线索或给我一个如何解决这个问题的提示?

2 个答案:

答案 0 :(得分:4)

我试过这段代码:

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作为最后一个命令。

答案 1 :(得分:0)

SAP在后端使用标准数据库引擎。您可以设置链接表,这些链接表直接从SAP提取到Access。没有导出\导入。这是一张现场桌子。

在此处查看:

How do I configure my Microsoft Access database to pull source data directly from SAP BW?

https://archive.sap.com/discussions/thread/1382889