首页 > 解决方案 > 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

但这似乎不起作用。

任何帮助是极大的赞赏!!

标签: vbaexcel

解决方案


可以采用 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

推荐阅读