【发布时间】:2021-02-10 20:36:10
【问题描述】:
我想在尝试阅读时获得有关字节顺序标记( 或 EF BB BF 十六进制)引起的臭名昭著的问题的新建议带有 VBA (Excel) 的 UTF-8 编码 CSV。请注意,我想避免使用 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's class module)。
- 使用 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 的数据源的技巧吗(除了循环手动填充我的记录集的字段)?
【问题讨论】:
-
@GSerg 不,不幸的是“CharacterSet=65001”对我的 CSV 没有任何好处。另外,我想避免创建工作表。
-
您不需要创建工作表。您想将数据查询到记录集中,它正是这样做的。
-
使用
CharacterSet=65001,您仍然会在第一个字段名称前加上?。