Excel 查询管道分隔文件不返回所有记录
我正在使用VBA和ADODB查询管道分隔的文本文件。我试过使用ACE和JET引擎,但结果是一样的,而且不正确。我在目录中保存了一个“schema.ini”文件,告诉引擎该文件是管道分隔的。但是,当查询完成时,当我可以看到文本文件中的数据时,我的数据会移动列和其他空白字段。我使用Excel 查询管道分隔文件不返回所有记录,excel,vba,adodb,Excel,Vba,Adodb,我正在使用VBA和ADODB查询管道分隔的文本文件。我试过使用ACE和JET引擎,但结果是一样的,而且不正确。我在目录中保存了一个“schema.ini”文件,告诉引擎该文件是管道分隔的。但是,当查询完成时,当我可以看到文本文件中的数据时,我的数据会移动列和其他空白字段。我使用CopyFromRecordset方法将结果传输到工作簿。有人能从我的代码中看出什么吗?还是有人碰到过这个 我的连接字符串: With Conn .Provider = "Microsoft.ACE.OLEDB.12
CopyFromRecordset
方法将结果传输到工作簿。有人能从我的代码中看出什么吗?还是有人碰到过这个
我的连接字符串:
With Conn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & strPath & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
.Open
End With
“strPath”的值:
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”和“6544475”。最奇怪的是,当我在Excel中直接打开这些文件并使用文本对列进行分析时,它们的解析完全正确
08/31/2015|000|000|Recital #5546|0000000012|88885463|123334563
08/31/2015|000|000|DII #7412|651111100|654444475|00000326541
我重新检查了一下,问题只是它正在删除列,而不是在移动列。对不起,有什么困惑
更新
我在文本文件中进行了查找/替换,并将“^”替换为“|”。然后我又试着运行这个,我遇到了同样的问题 虽然我仍然不确定问题可能出在哪里,但以下是一个可用的解决方案:
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文件中一百万行的导入。
虽然我确信有比此解决方案更好的方法,但您可能希望在此期间尝试一下。虽然我仍然不确定问题可能出在哪里,但以下是一个可用的解决方案:
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文件中一百万行的导入。
虽然我确信有比此解决方案更好的方法来实现这一点,但您可能希望在此期间尝试一下。我的理解是正确的:问题是,列开始移动,就像文本文件中有额外的分隔符一样(您看不到)?如果是这样,那么问题可能不是您的代码,而是其中的分隔符和潜在的文本限定符(如果有)。您提供的代码对我来说似乎很好,与我多年来使用的代码相比:您对我的问题的理解是正确的。查询还会删除文本文件中存在的某些记录的列中的值,而不会删除其他记录的列中的值。让我研究一下文本限定符,看看这是否有帮助。我很感激你的回答。你能详细说明一下“潜在的文本限定词”可能是什么吗?这是我可以诊断和修复的吗?当你有一个csv,那么你有多个列。这些列之间用分隔符分隔。通常这是一个逗号
,
。然而,如果其中一列(要导入)包含文本,而这个“文本列”甚至可能包含逗号,那么导入就会出错。因此,要识别这样的文本,csv文件将使用文本限定符来识别这样的文本。这里讨论了与SQL相关的MSDN(因此并非完全匹配)。但是我想你会比我在这里写一个简短的评论更好地理解这个想法:只是为了让我正确理解:问题是,列开始移动,就像文本文件中有额外的分隔符一样(你看不到)?如果是这样,那么问题可能不是您的代码,而是其中的分隔符和潜在的文本限定符(如果有)。您提供的代码对我来说似乎很好,与我多年来使用的代码相比:您对我的问题的理解是正确的。查询还会删除文本文件中存在的某些记录的列中的值,而不会删除其他记录的列中的值。让我研究一下文本限定符,看看这是否有帮助。我很感激你的回答。你能详细说明一下“潜在的文本限定词”可能是什么吗?这是我可以诊断和修复的吗?当你有一个csv,那么你有多个列。这些列之间用分隔符分隔。通常这是一个逗号,
。然而,如果其中一列(要导入)包含文本,而这个“文本列”甚至可能包含逗号,那么导入就会出错。因此,要识别这样的文本,csv文件将使用文本限定符来识别这样的文本。这里讨论了与SQL相关的MSDN(因此并非完全匹配)。但我想你会比我在这里写一个简短的评论更好地理解这个想法:谢谢你的帮助。我知道还有其他方法可以做到这一点,但我需要(或更喜欢)在将数据导入Excel之前将其处理到可管理的数量。感谢您的帮助。我知道还有其他方法可以做到这一点,但我需要(或更喜欢)在将数据放入Excel之前将其处理到可管理的数量。