在尝试使用 VBA (Excel) 读取 UTF-8 编码的 CSV 时,我想就字节顺序标记( 或十六进制的EF BB BF )引起的臭名昭著的问题获得新的建议。请注意,我想避免使用 Workbooks.Open 或 FileSystemObject 打开 CSV。实际上,我宁愿使用 adodb.RecordSet,因为我需要执行某种 SQL 查询。
在阅读了很多(很多!)的东西之后,我相信处理这个特定问题的 4 个最佳解决方案是:
- 在使用 ADODB.Connection / ADODB.RecordSet 读取 CSV 之前移除 BOM(例如,通过 #iFile 或 Scripting.FileSystemObject-OpenAsTextStream 来有效地读取文件的第一行并移除 BOM)。
- 创建 schema.ini 文件以便 ADO 正确解析 CSV。
- 使用向导创建的一些模块(如W. Garcia 的类模块)。
- 使用 ADODB.Stream 并设置 Charset = "UTF-8"。
最后一个解决方案(使用流)似乎很好,但执行以下操作会返回一个字符串:
Sub loadCsv()
Const adModeReadWrite As Integer = 3
With CreateObject("ADODB.Stream")
.Charset = "utf-8"
.Mode = adModeReadWrite
.Open
.LoadFromFile ("C:\atestpath\test.csv")
Debug.Print .readtext
End With
End Sub
您是否知道任何可以帮助使用 .readtext 返回的字符串作为 ADODB.RecordSet 或 ADODB.Connection 的数据源的技巧(除了循环手动填充我的记录集的字段)?