无法在PowerShell中显示每行相同组的多个捕获

时间:2017-07-12 06:50:27

标签: regex powershell csv

因此,如果正则表达式只匹配主文件中每一行的一个条目,那么powershell脚本就能正常工作,但如果每行中有多个条目匹配,那么输出就不是预期的。我正在使用它: -

$FILE_RE = '^[^\:]*[^\.txt:]'
$TEXT_RE = '"(.*?)"'
$TEXT = (Get-Content .\masterfile.txt).ToUpper() |
                ForEach-Object { 
                    New-Object psobject -Property @{
                        fileName = [regex]::Matches($_, $FILE_RE).Value
                        Value = [regex]::Matches($_, $TEXT_RE).value 
                    }
                }
         $TEXT | Select-Object  fileName , Value |  Sort-Object * -Unique |
         Export-Csv   TEXT.CSV -NoTypeInformation`

文件的数据和相应的正则表达式can be found here. “值”选项卡中的输出包含 System.Object [] ,其中包含2个值。我如何在 System.Object [] 中显示所有条目,并在第一列中显示相应的文件名。 预期的输出是: -

fileName    Value
FILE1.TXT   VALUE1
FILE1.TXT   VALUE2
FILE2.TXT   VALUE3
FILE2.TXT   TEST STRING1
FILE3.TXT   VALUE4
FILE3.TXT   3456789
FILE4.TXT   VALUE5
FILE4.TXT   TEXT1
FILE5.TXT   VALUE6
FILE5.TXT   LOREM IPSUM
FILE6.TXT   VALUE7

1 个答案:

答案 0 :(得分:1)

由于每行有几个$ TEXT_RE的发现,你需要存储文件并迭代查找。

  • 删除了中间$ Text
  • 必须从值
  • 修剪周围的"
$FILE_RE = '^[^:]+'
$TEXT_RE = '"([^ ].+?)"'
(Get-Content .\masterfile.txt).ToUpper() | ForEach-Object {
    $File = [regex]::Matches($_, $FILE_RE).Value
    ForEach ($Value in ([regex]::Matches($_, $TEXT_RE).value)) {
        New-Object psobject -Property @{
            fileName = $File
            Value    = $Value.Trim('"')
        }
    }
} | Select-Object  fileName , Value |  Sort-Object * -Unique |
    Export-Csv .\TEXT.CSV -NoTypeInformation
Import-Csv .\TEXT.CSV

示例输出:

fileName  Value
--------  -----
FILE1.TXT VALUE1
FILE1.TXT VALUE2
FILE2.TXT TEST STRING1
FILE2.TXT VALUE3
FILE3.TXT 3456789
FILE3.TXT VALUE4
FILE4.TXT TEXT1
FILE4.TXT VALUE5
FILE5.TXT LOREM IPSUM
FILE5.TXT VALUE6
FILE6.TXT VALUE7