在Excel中快速从CSV文件中提取行VBA

问题描述:

我有大约5000个.csv文件,我想在每个文件中搜索一行并将其解压缩。我粘贴了下面的代码的关键部分,这是可行的,但由于我必须打开和关闭每个.csv文件,所以对于5000个文件来说,这个过程很慢。有没有办法读取一个CSV文件,而无需打开它?我曾考虑编写一个小脚本来将每个csv文件转换为Excel?谢谢。在Excel中快速从CSV文件中提取行VBA

SP_File_Name = Dir(DN_Path & "*.*") 
Count = 1 

Set START_CELL_RANGE = TARGET_SP_SHEET.Range("B3") 
Set TICKER_CODE_RANGE = TARGET_SP_SHEET.Range("B1") 


    While (SP_File_Name <> "") 
    SP_Full_Path = DN_Path & SP_File_Name 
    Workbooks.OpenText Filename:=SP_Full_Path, DataType:=xlDelimited, comma:=True, Local:=True 

    Set INPUT_WORKBOOK = ActiveWorkbook 
    Set INPUT_SHEET = INPUT_WORKBOOK.Worksheets(1) 
    INPUT_SHEET.Range("$A$1").Select 
    Set INPUT_RANGE = ActiveCell.CurrentRegion 

    Set INPUT_FIRST_MATCH_RANGE = INPUT_RANGE.Find(TICKER_CODE_RANGE) 

    If INPUT_FIRST_MATCH_RANGE Is Nothing Then 
    GoTo NOT_FOUND 
    End If 


    START_CELL = START_CELL_RANGE.Address 

    TARGET_SP_SHEET.Range(START_CELL_RANGE.Address, START_CELL_RANGE.Offset(0, 6).Address).Value = INPUT_SHEET.Range(INPUT_FIRST_MATCH_RANGE.Address, INPUT_FIRST_MATCH_RANGE.Offset(0, 7).Address).Value 

    ' write diagnostics 
    Sheet5.Range("K" & Count + 4).Value = START_CELL 
    Sheet5.Range("L" & Count + 4).Value = "$A$1" 
    Sheet5.Range("M" & Count + 4).Value = INPUT_FIRST_MATCH_RANGE.Address 
    Sheet5.Range("N" & Count + 4).Value = INPUT_FIRST_MATCH_RANGE.Offset(0, 7).Address 

NOT_FOUND: 
    Set START_CELL_RANGE = START_CELL_RANGE.Offset(1, 0) 

    Workbooks(SP_File_Name).Close SaveChanges:=False 
    SP_File_Name = Dir 
    Count = Count + 1 

    Wend 
+3

这可能有所帮助。看起来像一个类似的问题。 http://stackoverflow.com/questions/14907952/load-contents-of-csv-file-to-array-without-opening-file –

+2

您如何在不打开文件的情况下阅读文件内容?你觉得VBA有心理能力吗?你可以在不打开封面的情况下阅读书中的文字吗?赶快 - 给我第100页“我,机器人”上的第20个单词。首先将CSV文件转换为Excel格式将无济于事;你*仍然*必须打开每个文件来阅读内容。 –

+0

我可能会使用Windows Cmd Shell命令'findstr'。您可以将所有行输出到文件中,然后将该文件读入Excel中,或者在涉及更多编程时直接输出到Excel中。你可以从VBA运行脚本。你可能也可以使用PowerShell,但我并不熟悉这一点。 –

要调用VBA中的cmd命令,我已经使用了WshShell。对于早期绑定,我设置了对Windows脚本宿主对象模型的引用

Shell函数的一个问题是它异步运行。通过使用WshShell Run方法,您可以等到完成后再执行后续命令。

示例代码可能如下:

Option Explicit 
Sub foo() 
Dim WSH As WshShell 
Dim lErrCode As Long 

Set WSH = New WshShell 
lErrCode = WSH.Run("cmd /c findstr /C:""Power"" ""C:\Users\Ron\filelist.txt"" > ""C:\Users\Ron\Results2.txt""", 1, True) 
    If lErrCode <> 0 Then 
     MsgBox "Error Code: " & lErrCode 
     Stop 
    End If 
Set WSH = Nothing 

Call Shell 
End Sub 

关于您的命令,您在您的评论表明,我将确保VBA正确解释字符串为cmd提示。看着你的代码行,我会怀疑你是否在搜索字符串和文件路径之间缺少空格。

+0

感谢@RonRosenfeld只要我使用硬编码路径和文件名,我可以得到这个工作。是否有技巧通过字符串传递路径名和搜索字符串变量?我必须承认,我在使用双引号时遇到了困难,并且还原为单引号和&。欢呼 – RockDr

+0

@RockDr据我所知,没有任何技巧。我通常不使用硬编码的文件路径。构建你的路径到一个变量,它应该工作得很好。在上面的命令中,我并不需要加双引号,因为路径中没有空格 - 只是显示它们来演示它们的用法。确保从变量构建的行按预期运行,方法是将其复制/粘贴到cmd shell窗口中。这应该告诉你问题在哪里。 –

+0

thx现在似乎工作,以前一定是一个错字。我仍然无法使用全路径名称,主要是因为空格,也可能是其他字符。这是路径:C:\ Users \ craig_000 \ OneDrive - Moulton Metals Pty Ltd \ Moulton Metals \ MSc Mineral Economics \ Capstone \ TXT_Data我尝试了替换搜索“”并替换为%20,但似乎没有帮助?当然,如果我使用双引号,它会将我的stribng变量解释为文本文本。thx堆为您提供帮助:) – RockDr

我不认为你可以在不打开的情况下阅读文件的内容。为什么不将所有5000个文件合并到一个文件中并将其读入Excel。当然会更快。使用命令行窗口,它指向包含所有5000个文件的文件夹,输入:

副本* .CSV merge.csv

参见下面一个例子的链接。

http://analystcave.com/merge-csv-files-or-txt-files-in-a-folder/