Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 查询管道分隔文件不返回所有记录_Excel_Vba_Adodb - Fatal编程技术网

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

Excel 查询管道分隔文件不返回所有记录,excel,vba,adodb,Excel,Vba,Adodb,我正在使用VBA和ADODB查询管道分隔的文本文件。我试过使用ACE和JET引擎,但结果是一样的,而且不正确。我在目录中保存了一个“schema.ini”文件,告诉引擎该文件是管道分隔的。但是,当查询完成时,当我可以看到文本文件中的数据时,我的数据会移动列和其他空白字段。我使用CopyFromRecordset方法将结果传输到工作簿。有人能从我的代码中看出什么吗?还是有人碰到过这个 我的连接字符串: With Conn .Provider = "Microsoft.ACE.OLEDB.12

我正在使用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”的值:

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之前将其处理到可管理的数量。