需要将多行输出到CSV文件

时间:2017-10-17 23:17:16

标签: powershell powershell-v2.0 powershell-v3.0

我使用以下脚本遍历数百个文本文件,查找其中的正则表达式的特定实例。我需要向数组添加第二个数据点,它告诉我模式匹配的对象。

在下面的脚本中,[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

1 个答案:

答案 0 :(得分:1)

我可以想到两种方法,但最简单的方法是使用哈希表(dict)。另一种方法是创建psobjects来填充Lines变量。我将采用简单的方法,因此您只能使用一个变量哈希表。

$FolderPath = "C:\Test"  

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

    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>

您的结果将在$ Results中。 $ Result.keys包含文件夹名称。 $ Results.Values具有表达式的结果。您可以通过其键$ Results [&#34; Folder path&#34;]引用特定文件夹的结果。当然,如果密钥不存在,它将会出错。