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

Posted

技术标签:

【中文标题】将 .csv 导入 MS Access。 “AtEndOfStream”没有读取最后一行【英文标题】:Importing .csv to MS Access. "AtEndOfStream" doesn't read last line 【发布时间】:2016-02-02 17:42:28 【问题描述】:

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

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

【问题讨论】:

您发布的代码会引发错误,这不仅是因为缺少End Sub,还因为您正在尝试修改已关闭的记录集。请出示您的实际代码。 添加了其余部分,不确定这是否能说明问题。但我希望如此。 :) 您的代码仍然无法运行。您永远不会打开文件,也永远不会在 objRecordSet 中添加新记录。 minimal reproducible example 愚蠢的我,把那部分编辑掉了,由于一些错误捕获块,代码有点混乱。现在在里面。对不起。 你如何打开你的文件? // 叹息 【参考方案1】:

我试过这段代码:

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 添加为循环中的最后一个命令。

【讨论】:

做到了!感谢您的帮助,尤其是在提出正确问题的漫长过程中。 (;【参考方案2】:

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

【讨论】:

以上是关于将 .csv 导入 MS Access。 “AtEndOfStream”没有读取最后一行的主要内容,如果未能解决你的问题,请参考以下文章

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

将分隔文件 (.csv) 中的行导入 MS-Access 表

以编程方式在 Mac 上将 MS Access 导入 CSV

MS Access 导入 csv 广告覆盖表中的数据

使用 python 将 pandas 数据框导入 MS Access 表

将 MS Access 表定义导出和导入为文本文件