2016-09-16 103 views
0

我有大約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,但我並不熟悉這一點。 –

回答

0

要調用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

0

我不認爲你可以在不打開的情況下閱讀文件的內容。爲什麼不將所有5000個文件合併到一個文件中並將其讀入Excel。當然會更快。使用命令行窗口,它指向包含所有5000個文件的文件夾,輸入:

副本* .CSV merge.csv

參見下面一個例子的鏈接。

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