将 .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