vba - ADODB 导入 .csv 更改数据类型
问题描述
我有一些非常大的 .csv 文件,我想查询并提取条目。我已经成功地在 Excel 2016 中使用 ADO 进行了设置,或者看起来如此,而且速度非常快。我正在寻找使用查询字段 ID;
SELECT * FROM <file> WHERE ID = #.
直到包含字母的 ID 号(即 960545H4)之前,它都可以正常工作。这些出现在文件的更下方,大约 400k 行。
我认为问题在于 excel 假设此字段(在标题 ID 下)是基于数字的第一个 x 个条目。我希望将其设置为文本。
无论如何设置字段/列的数据类型以便我可以成功查询?
Sub testSQL()
Dim xlcon as ADOB.Connection
Dim xlrs as ADOB.RecordSet
Dim nextRow as Integer
Dim datafilepath as String
Dim datafilename as String
Set xlcon = New ADOB.Connection
Set xlrs = New ADOB.RecordSet
datafilepath = "U:\Common\"
datafilename = "test_file"
xlcon.Provider = "Microsoft.Jet.OLEDB.4.0"
xlcon.ConnectionString = "Data Source=" & datafilepath & ";" & "Extended Properties=""text;HDR=Yes;FMT=Delimited,"""
xlcon.Open
xlrs.Open "SELECT * FROM [" & datafilename & ".csv] WHERE ID = '023487562HH'", xlcon
'the rest of the code...
我希望有一些长线的东西;
SELECT * FROM [file] WHERE CStr(ID) = 34897562FD
但这似乎不起作用。
任何帮助是极大的赞赏!!
解决方案
可以采用 Killuminati 的解决方案并根据需要添加字段名称。该参数MaxScanRows
只是确保 OLEDB 驱动程序将扫描整个文件,如文档中所述
也可以确定字段的数据类型。使用 MaxScanRows 选项指示在确定列类型时应扫描多少行。如果将 MaxScanRows 设置为 0,则扫描整个文件。Schema.ini 中的 MaxScanRows 设置逐个文件覆盖 Windows 注册表中的设置。
为了声明每个字段的数据类型,可以使用这样的 schema.ini
[test_file.csv]
Format=Delimited(;)
DecimalSymbol=,
ColNameHeader=False
Col1=Field1 Text
Col2=Field2 Text
Col3=Field3 Text
Col4=StartDate Date
Col5=EndDate Date
Col6=Price Currency
等号后面的条目是字段的名称。柱子。如果文件包含一个标题,它可以是相同的,但不是必须的,但它是必需的。
代码可能看起来像这样
Sub ADO()
Dim rs As New ADODB.Recordset
Dim conn As New ADODB.Connection
Dim myPath As String
myPath = ThisWorkbook.Path & "\TextFiles\"
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & myPath & ";Extended Properties=""text;HDR=No;FMT=Delimited()"";"
With rs
.ActiveConnection = conn
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open "SELECT * FROM [test_file.csv]"
.AddNew
.Fields("Field1") = "Doe"
.Fields("Field2") = "John"
.Fields("Field3") = "123456"
.Fields("StartDate") = Date
.Fields("EndDate") = "05.10.2018"
.Fields("Price") = 1234.56
.Update
End With
conn.Close
End Sub
推荐阅读
- javascript - GettUncaught 错误:reCAPTCHA 占位符元素必须为空;只加载一次
- java - spring boot中的基本程序。只有一个异常导致失败
- python - 内容长度在 Curl、Wget 中可用,但在 Python 请求中不可用
- orocrm - 产品或商务 SKU 中的 Hypens
- javascript - 如何在 VIS 网络图中添加按选项选择?
- multithreading - Kotlin SupervisorJob 意外行为
- cube.js - Cube.js 无法连接来自不同数据源的表
- javascript - 如何更改它以显示用户在几分钟内输入?
- json - 当 X 从 Y 扩展并且 Y 是特征时,如何在 Play JSON 中定义 Y 和 List[X] 的格式?
- javascript - 数组/对象解构