查询管道分隔文件未返回所有记录

时间:2016-02-22 20:27:46

标签: excel vba adodb

我使用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)的问题,而且我经常使用它们。但是,我之前没有将它们用于管道分隔文件。

如果我的解释不清楚,或者您需要更多代码,请发表评论。

修改 请参阅下面的管道脱离文本文件中的两行。第一行正常解析。第二个是“651111100”和“654444475”。最奇怪的是,当我直接在Excel中打开它们并将文本用于列时,这些解析完全正常。

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

我重新检查了,问题只在于它正在丢弃列,而不是它正在移动它们。抱歉有任何困惑。

更新

我在文本文件中进行了查找/替换,并输入“^”而不是“|”。然后我试图再次运行它,我遇到了同样的问题!

1 个答案:

答案 0 :(得分: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

我的计算机上的测试运行在12秒内完成了80MB文件中100万行的导入。 虽然我确信有更好的方法可以做到这一点超出这个解决方案,但您可能希望在此期间尝试一下。