2017-10-17 134 views
0

我正在使用以下腳本遍歷數百個文本文件,查找其中的正則表達式的特定實例。我需要在數組中添加第二個數據點,它告訴我模式匹配的對象。需要輸出多行到CSV文件

在下面的腳本中,[Regex]::Matches($str, $Pattern) | % { $_.Value }部件爲每個文件返回多行,無法輕鬆輸出到文件。

我想知道的是,我將如何輸出一個2列的CSV文件,一列有文件名(應該是$_.FullName),一列是正則表達式結果?我現在所在的代碼在下面。

$FolderPath = "C:\Test" 

$Pattern = "(?i)(?<=\b^test\b)\s+(\w+)\S+" 
$Lines = @() 

Get-ChildItem -Recurse $FolderPath -File | ForEach-Object { 
    $_.FullName 
    $str = Get-Content $_.FullName 
    $Lines += [Regex]::Matches($str, $Pattern) | 
       % { $_.Value } | 
       Sort-Object | 
       Get-Unique 
} 

$Lines = $Lines.Trim().ToUpper() -replace '[\r\n]+', ' ' -replace ";", '' | 
     Sort-Object | 
     Get-Unique # Cleaning up data in array 
+0

請顯示樣本輸入以及與該輸入對應的期望輸出和實際輸出。 –

+0

我同意,因爲「和一列與正則表達式結果」是非常混淆 –

+0

可以說,腳本通過2個文件file1.txt和file2.txt搜索。正則表達式模式正在'測試'一詞後面查找單詞。如果文件中有多個實例,則正則表達式將返回多個結果。所以輸出將是一個包含2列的csv文件;第1列是腳本找到結果的文件,第2列是來自正則表達式模式的實際匹配。因此,如果在file1.txt中有3個匹配,則腳本有3行,col1表示每行有file1.txt,col2是'match1','match2'等。 – shannonjk

回答

1

我能想到兩種方法,但最簡單的方法是使用散列表(dict)。另一種方法是創建psobjects來填充你的Lines變量。我將以簡單的方式去做,所以你只能使用一個變量,哈希表。

$FolderPath = "C:\Test" 

$Pattern = "(?i)(?<=\b^test\b)\s+(\w+)\S+"      
$Results [email protected]{}                     

    Get-ChildItem -Recurse $FolderPath -File |            
    ForEach-Object {                       
     $str = Get-Content $_.FullName               
     $Line = [regex]::matches($str,$Pattern) | % { $_.Value } | Sort-Object | Get-Unique 
     $Line = $Line.Trim().ToUpper() -Replace '[\r\n]+', ' ' -Replace ";",'' | Sort-Object | Get-Unique # Cleaning up data in array 
     $Results[$_.FullName] = $Line 
    } 
    $Results.GetEnumerator() | Select @{L="Folder";E={$_.Key}}, @{L="Matches";E={$_.Value}} | Export-Csv -NoType -Path <Path to save CSV> 

您的結果將以$結果顯示。 $ Result.keys包含文件夾名稱。 $ Results.Values有表達式的結果。您可以通過鍵$ Results [「文件夾路徑」]來引用特定文件夾的結果。如果密鑰不存在,當然會出錯。

+0

謝謝Parrish,這是非常接近我所需要的!剩下的唯一事情就是將結果輸出爲字符串而不是單獨的行。有什麼辦法可以做到這一點? – shannonjk

+0

現在,我看,你的行,如果它是一個數組不會返回數組,但對象名稱。看起來你正試圖在CSV中放入一個CSV。除非你將這些行作爲一個字符串或某種分隔符來處理,否則它將不起作用。如果你想單獨的行(聽起來像嵌入的CSV),那麼我只會保存到JSON。 CSV只需要字符串和整數,但不理解多行值。 JSON理解數組。 – Parrish