ADODB导入的.csv更改数据类型

时间:2018-09-26 11:30:26

标签: excel vba excel-vba

我有一些非常大的.csv文件,我想查询这些文件并提取条目。我已经成功地在Excel 2016中使用ADO进行了设置,或者看起来如此,而且速度非常快。我正在使用以下方法查询字段ID:

SELECT * FROM <file> WHERE ID = #.

这一直很好,直到包含字母的ID号(即960545H4)为止。这些出现在文件的更下方,大约有40万行。

我认为问题在于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

但这似乎不起作用。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

感谢Storax关于使用架构文件的建议,我已经完成了这项工作。

我在与文件相同的位置创建了一个模式文件。该文件看起来像;

 let data = new FormData();
 data.append('foo', 'bar');
 data.append('file', document.getElementById('file').files[0]);
 let config = {
      onUploadProgress: function(progressEvent) {
              let percentCompleted = Math.round( (progressEvent.loaded * 100) / progressEvent.total );
      }
 };
 axios.put('/upload/server', data, config)
            .then(function (res) {
              output.className = 'container';
              output.innerHTML = res.data;
            })
            .catch(function (err) {
              output.className = 'container text-danger';
              output.innerHTML = err.message;
            });

我现在可以返回正在寻找的ID!非常感谢Storax提供此解决方案!

答案 1 :(得分:0)

可以采用Killuminati的解决方案,并根据需要添加字段名称。参数MaxScanRows仅确保OLEDB驱动程序将按照documentation

中所述扫描整个文件。
  

还可以确定字段的数据类型。使用   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