ADODB импортировал .csv изменить тип данных - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть несколько очень больших файлов .csv, которые я хочу запрашивать и извлекать записи.Я настроил это с помощью ADO в Excel 2016 успешно, или, как показалось, и удивительно быстро.Я пытаюсь запросить идентификатор поля с помощью;

SELECT * FROM <file> WHERE ID = #.

Это работало нормально до тех номеров идентификаторов, которые содержат буквы, то есть 960545H4.Они появляются намного дальше вниз по файлу, примерно на ~ 400 тыс. Строк.

Я полагаю, что проблема заключается в том, что Excel полагает, что это поле (под идентификатором заголовка) является числовым на основе первого 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 голосов
/ 26 сентября 2018

Можно взять решение Киллуминати и добавить имена полей по мере необходимости.Параметр MaxScanRows просто гарантирует, что драйвер OLEDB будет сканировать весь файл, как указано также в документации

Также могут быть определены типы данных полей.Используйте параметр MaxScanRows, чтобы указать, сколько строк следует сканировать при определении типов столбцов.Если вы установите MaxScanRows в 0, весь файл будет отсканирован.Параметр MaxScanRows в Schema.ini переопределяет параметр в реестре 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
0 голосов
/ 26 сентября 2018

Благодаря рекомендации Storax по использованию файла схемы у меня все получилось.

Я создал файл схемы в том же месте, что и файл.Файл выглядел так:

[test_file.csv]
Format=CSVDelimited
ColNameHeader=True
MaxScanRows=0

Теперь я могу вернуть нужные мне идентификаторы!Большое спасибо Storax за это решение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...