2017-10-17 95 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