将包含偶尔使用引号的 .CSV 文件导入 MS Access
Import .CSV file containing sporadic use of quotation marks into MS Access
我正在 importing/inserting 从 .csv 文件到 MS Access 数据库的数据。
.csv 文件中的某些字段有引号,其他则没有(如果字段包含逗号,则字段放在引号内)。
只有一些字段包含引号的事实会导致导入跳过包含带引号的字段的每一行(没有引号的字段可以正常导入)。
如何 import/insert 所有字段(不考虑引号)?
这是我到数据库的连接字符串:
Set conn = New ADODB.Connection
conn.open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=somefolder\database.accdb"
这是我的查询,将 .csv 文件 (UTF-8) 中的数据插入数据库(.csv 文件确实以逗号分隔):
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
简要背景
数据库将由对 VBA 或数据库不感兴趣的同事每天更新。因此,import/insert 必须自动化并且 运行 来自 Excel.
中包含的宏
更新:
我最终用 Adodb Stream 解析了 .csv 文件(因为 FileSystemObject 似乎无法处理 UTF-8)。我也可以访问制表符分隔的 .csv 文件,虽然我可以更轻松地使用 Adodb Stream 来处理(但我知道我无法使用上述方法正确读取)。然而,制表符分隔的 .csv 文件似乎很难在任何地方处理——所以我坚持使用逗号分隔的文件格式并按照 Gustav 的建议进行;清理每一行以去除引号。
现在我已经开始工作了,我很高兴我已经这样做了,因为我已经能够更正 .csv 文件中的其他问题,而且每个 .csv 文件只需要大约 3 秒的时间来解析,清理并插入数据库。
也许先尝试将数据导入 Excel,看看它是否给出正确的结果。如果正确,那么,您可以将数据从 Excel 直接导入到 Access。
没有安全简单的方法来导入不一致的数据。
因此,以文本形式打开文件,逐行阅读,应用您可能认为需要的任何验证、转换、and/or 更正,然后将行的字段附加到 table。
如果您想使用来自 VBA 的 csv 文件,请查看 this project。我可以理解您需要通过 Excel 从 CSV 中获取原始数据,一个快速的选择是将 CSV 记录加载到数组中,然后将其转储到工作表中。
试试这个:
Sub ImportRecords_RFC4180()
Dim CSVix As CSVinterface
Dim filePath As String
filePath = "C:\Demo.csv" 'Change this to suit your needs
Set CSVix = New CSVinterface 'Create new instance
Call CSVix.OpenConnection(fileName) 'Open a physical connection to the CSV file
Call CSVix.ImportFromCSV 'Import data
Call CSVix.DumpToSheet 'Dumps the data to the current Workbook's new Worksheet starting at named "A1" range.
Set CSVix = Nothing 'Terminate the current instance
End Sub
我注意到导入文本向导中的 Text Qualifier
字段。如果您 select 那里的引号 "
,MS Access 将正确导入数据并识别引号中的逗号不是分隔符。
不过我不确定如何在 VBA 中应用它。
我正在 importing/inserting 从 .csv 文件到 MS Access 数据库的数据。 .csv 文件中的某些字段有引号,其他则没有(如果字段包含逗号,则字段放在引号内)。 只有一些字段包含引号的事实会导致导入跳过包含带引号的字段的每一行(没有引号的字段可以正常导入)。
如何 import/insert 所有字段(不考虑引号)?
这是我到数据库的连接字符串:
Set conn = New ADODB.Connection
conn.open = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=somefolder\database.accdb"
这是我的查询,将 .csv 文件 (UTF-8) 中的数据插入数据库(.csv 文件确实以逗号分隔):
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
简要背景
数据库将由对 VBA 或数据库不感兴趣的同事每天更新。因此,import/insert 必须自动化并且 运行 来自 Excel.
中包含的宏更新: 我最终用 Adodb Stream 解析了 .csv 文件(因为 FileSystemObject 似乎无法处理 UTF-8)。我也可以访问制表符分隔的 .csv 文件,虽然我可以更轻松地使用 Adodb Stream 来处理(但我知道我无法使用上述方法正确读取)。然而,制表符分隔的 .csv 文件似乎很难在任何地方处理——所以我坚持使用逗号分隔的文件格式并按照 Gustav 的建议进行;清理每一行以去除引号。
现在我已经开始工作了,我很高兴我已经这样做了,因为我已经能够更正 .csv 文件中的其他问题,而且每个 .csv 文件只需要大约 3 秒的时间来解析,清理并插入数据库。
也许先尝试将数据导入 Excel,看看它是否给出正确的结果。如果正确,那么,您可以将数据从 Excel 直接导入到 Access。
没有安全简单的方法来导入不一致的数据。
因此,以文本形式打开文件,逐行阅读,应用您可能认为需要的任何验证、转换、and/or 更正,然后将行的字段附加到 table。
如果您想使用来自 VBA 的 csv 文件,请查看 this project。我可以理解您需要通过 Excel 从 CSV 中获取原始数据,一个快速的选择是将 CSV 记录加载到数组中,然后将其转储到工作表中。
试试这个:
Sub ImportRecords_RFC4180()
Dim CSVix As CSVinterface
Dim filePath As String
filePath = "C:\Demo.csv" 'Change this to suit your needs
Set CSVix = New CSVinterface 'Create new instance
Call CSVix.OpenConnection(fileName) 'Open a physical connection to the CSV file
Call CSVix.ImportFromCSV 'Import data
Call CSVix.DumpToSheet 'Dumps the data to the current Workbook's new Worksheet starting at named "A1" range.
Set CSVix = Nothing 'Terminate the current instance
End Sub
我注意到导入文本向导中的 Text Qualifier
字段。如果您 select 那里的引号 "
,MS Access 将正确导入数据并识别引号中的逗号不是分隔符。
不过我不确定如何在 VBA 中应用它。