我使用以下脚本遍历数百个文本文件,查找其中的正则表达式的特定实例。我需要向数组添加第二个数据点,它告诉我模式匹配的对象。
在下面的脚本中,[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 :(得分: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;]引用特定文件夹的结果。当然,如果密钥不存在,它将会出错。