Vba 将包含偶尔使用引号的.CSV文件导入MS Access

Vba 将包含偶尔使用引号的.CSV文件导入MS Access,vba,csv,ms-access,adodb,Vba,Csv,Ms Access,Adodb,我正在将.csv文件中的数据导入/插入MS Access数据库。 .csv文件中的某些字段中有引号,其他字段中没有引号(如果该字段包含逗号,则该字段位于引号内)。 只有某些字段包含引号这一事实会导致导入跳过包含带引号字段的每一行(不带引号的字段可以很好地导入) 如何导入/插入所有字段(不考虑引号)? 这是我与dabase的连接字符串: Set conn = New ADODB.Connection conn.open = "Provider=Microsoft.ACE.OLEDB.12

我正在将.csv文件中的数据导入/插入MS Access数据库。 .csv文件中的某些字段中有引号,其他字段中没有引号(如果该字段包含逗号,则该字段位于引号内)。 只有某些字段包含引号这一事实会导致导入跳过包含带引号字段的每一行(不带引号的字段可以很好地导入)

如何导入/插入所有字段(不考虑引号)?

这是我与dabase的连接字符串:

Set conn = New ADODB.Connection
conn.open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=somefolder\database.accdb"
以下是我的查询,它将.csv文件(UTF-8)中的数据插入数据库(.csv文件确实是逗号分隔的):

简要背景

数据库将由我对VBA或数据库不感兴趣的同事每天更新。因此,导入/插入必须自动化,并从Excel中包含的宏运行

更新: 最后我用Adodb流解析了.csv文件(因为FileSystemObject似乎无法处理UTF-8)。我也可以访问以制表符分隔的.csv文件,我认为使用Adodb Stream可以更容易地处理这些文件(但我知道使用上述方法无法正确读取这些文件)。然而,制表符分隔的.csv文件似乎很难在任何地方处理——所以我坚持使用逗号分隔的文件格式,并按照古斯塔夫的建议去做;清理每一行以去除引号


现在我已经开始工作了,我很高兴我已经这样做了,因为我已经能够纠正.csv文件中的其他问题,而且每个.csv文件只需要大约3秒钟就可以解析、清理并插入到数据库中。

也许可以先尝试将数据导入Excel,看看它是否给出正确的结果。如果正确,则可以直接从Excel导入数据以访问。

没有安全简单的方法来导入不一致的数据


因此,以文本形式打开文件,逐行阅读,应用可能需要的验证、转换和/或更正,然后将行字段附加到表中。

如果要使用VBA中的csv文件,请查阅。我可以理解您需要通过Excel从CSV获取原始数据,一个快速选项是将CSV记录加载到数组中,然后将其转储到工作表中

试试这个:

Sub-ImportRecords\u RFC4180()
作为CSV接口的Dim CSVix
将文件路径设置为字符串
filePath=“C:\Demo.csv”'更改此选项以满足您的需要
设置CSVix=New CSVinterface“创建新实例”
调用CSVix.OpenConnection(fileName)'打开到CSV文件的物理连接
调用CSVix.ImportFromCSV“导入数据”
Call CSVix.DumpToSheet'将数据转储到当前工作簿的新工作表中,从命名的“A1”范围开始。
设置CSVix=Nothing'终止当前实例
端接头

我注意到导入文本向导中的
文本限定符
字段。如果在此处选择引号
,MS Access将正确导入数据,并将识别引号中的逗号不是分隔符

但我不确定如何在VBA中应用此功能


这主意不错。我有点担心手术会“花太长时间”,因为导入包含4个.csv文件,每个文件大约有2000行。让他们在excel中运行可能会比我喜欢的慢很多。但我肯定会尝试导入Excel,然后查看数据的外观。关闭屏幕更新、自动计算和其他通常会减慢代码速度的功能。根据我自己的经验:关闭这些东西有助于我将代码执行时间从30-40分钟减少到30秒以下。在Excel中打开文件时,文件也“凌乱”,因此我选择了Gustav的上述方法。在这种情况下,我还可以选择以制表符分隔(而不是逗号分隔)的形式下载数据。选项卡分隔版本不包含引号。我上面建议的解决方案不适用于制表符分隔的文件,但如果我打算使用FileSystemObject解析文件,我还是使用制表符分隔的文件为好。谢谢你的意见古斯塔夫。古斯塔夫;如果你发表评论作为回答,我可以标记为接受。
Set rs = New ADODB.Recordset
Query = "INSERT INTO [table] SELECT * FROM [" & strCSVFileName & "] " _
        & "IN """ & strCSVFolder & """ ""Text;HDR=Yes;FMT=Delimited;CharacterSet=65001;""" 
rs.Open Query, conn