2016-02-22 2 views
1

Я запрашиваю текстовый файл с разделителями каналов с помощью VBA с ADODB. Я пробовал использовать как ACE, так и JET-движки, но результаты те же, и не правильные. Я сохранил файл «schema.ini» в каталоге, сообщающем движку, что файл имеет ограничиваемый канал. Однако, когда запрос завершается, у меня есть данные, которые сдвинули столбцы и другие поля, которые пусты, когда я могу видеть данные в текстовом файле. Я использую метод CopyFromRecordset для передачи результатов в свою книгу. Может ли кто-нибудь увидеть что-то в моем коде? Или кто-нибудь сталкивается с этим?Файл с разделителями труб запроса, не возвращающий все записи

Моя строка соединения:

With Conn 
    .Provider = "Microsoft.ACE.OLEDB.12.0" 
    .ConnectionString = "Data Source=" & strPath & ";" & _ 
     "Extended Properties=""text;HDR=YES;FMT=Delimited""" 
    .Open 
End With 

Значение "strPath":

strPath = "H:\Folder\" 

SQL Строка:

strSQL = "SELECT * FROM " & strFile & ";" 

Передача данных:

With ThisWorkbook 
    With .Sheets("CashFlows") 
     .Range("a2").CopyFromRecordset Rst 
     With .Range("a1") 
      For i = 0 To Rst.Fields.Count - 1 
       .Offset(0, i) = Rst.Fields(i).Name 
      Next i 
     End With 
    End With 
End With 

У меня никогда не было проблем с ADO (или Ace или Jet), и я использую их довольно часто. Тем не менее, я не использовал их для файлов с разделителями каналов.

Оставьте комментарий, если я неясен в своем объяснении, или если вам требуется больше кода.

EDIT См. Две строки из текстового файла, расположенного ниже. Первая строка анализирует обычно. Второй кадр «651111100» и «654444475». Самое странное, что эти синтаксические разборки полностью прекрасны, когда я открываю их непосредственно в Excel и использую текст для столбцов.

08/31/2015|000|000|Recital #5546|0000000012|88885463|123334563 
08/31/2015|000|000|DII #7412|651111100|654444475|00000326541 

Я повторно проверил, и проблема заключается только в том, что он отбрасывает столбцы, а не то, что он их перемещает. Извините за любую путаницу.

UPDATE

Я сделал поиска/замены в текстовом файле и поместить в "^" вместо "|". Затем я попытался запустить это снова, и я столкнулся с той же проблемой!

+0

Именно поэтому я правильно понимаю: проблема в том, что столбцы начинают смещаться так, как если бы в текстовом файле были дополнительные разделители (которые вы не видите)? Если это так, то проблема, вероятно, не в вашем коде, а в разделителе и потенциальном текстовом определителе (если есть). Код, который вы предоставляете, кажется мне прекрасным и сравнивается с тем, который я использую в течение многих веков: https://coastalcoder.wordpress.com/2012/10/26/importing-selected-data-from-csv-file-into-excel -using-vba-ado/ – Ralph

+0

Ваше понимание моей проблемы верное. Запрос также отбрасывает значения в столбцах для определенных записей, которые существуют в текстовом файле, и не отбрасывает их для других. Позвольте мне взглянуть на текстовые квалификаторы и посмотреть, помогает ли это вообще. Я ценю ответ. – Kyle

+0

Можете ли вы рассказать о том, что может быть «потенциальным текстовым определителем внутри»? Это что-то я могу диагностировать и исправить? – Kyle

ответ

0

Хотя я до сих пор не уверен, что проблема может быть, следующее годным к употреблению раствор:

Option Explicit 

Public Sub ImportTextFile() 

Dim lngRowNumber As Long 
Dim strImportFile As String 
Dim intNextFreeFile As Integer 
Dim strOneImportLine As String 
Dim arySplitLine As Variant 

With Application 
    .ScreenUpdating = False 
    .Calculation = xlManual 
    .EnableEvents = False 
End With 

intNextFreeFile = FreeFile 
strImportFile = "C:\path\to\the\TextFile.csv" 
lngRowNumber = 1 

Open strImportFile For Input Access Read As #intNextFreeFile 

Do While Not EOF(intNextFreeFile) 
    Line Input #intNextFreeFile, strOneImportLine 
    arySplitLine = Split(strOneImportLine, "|") 
    Sheets(1).Cells(lngRowNumber, 1).Value2 = arySplitLine 
    lngRowNumber = lngRowNumber + 1 
Loop 

Close #intNextFreeFile 

With Application 
    .ScreenUpdating = True 
    .Calculation = xlAutomatic 
    .EnableEvents = True 
End With 

End Sub 

тест-пробег на моем компьютере завершена импорта для одного миллиона строк в файле 80MB в течение 12 секунд , Хотя я уверен, что есть лучшие способы сделать это, которые превосходят это решение, вы можете попробовать попробовать.

+0

Спасибо за помощь. Я знал, что есть другие способы сделать это, но мне нужно (или очень предпочитаю) обрабатывать данные до управляемой суммы, прежде чем переносить их в Excel. – Kyle

 Смежные вопросы

  • Нет связанных вопросов^_^