捕获并将多个命名组导出到csv

时间:2013-10-16 17:40:32

标签: regex powershell

我想使用正则表达式从输入文件中捕获两个特定数据:

$reg = [regex]"(?<Name>^Name:.*)|(?<Id>^Id:.*)"
gci C:\test\*.txt | Get-Content | Select $reg -allmatches | Select -Expand Matches|
...
new-object psobject -property @{Name=$n; Id=$i}
...
Select-Object Name, Id | Export-Csv c:\info.csv –NoTypeInformation

我遇到的问题是某些文件没有“Id”条目。如果任何文件中没有“Id”条目,则它不会显示在导出的csv文件中。如果有人能帮我提出解决方案,我将不胜感激。

C:\test\file1.txt包含:

Name: Sturgeon Ocean   
Alias: Socean   
Id: 384932   
Address: 3600 Caviar  
Street, Pacific beach   
...   
Cell: 389-394-3843   
...  

1 个答案:

答案 0 :(得分:0)

未经测试,但我认为这应该有效:

Foreach ($file in gci C:\test\*.txt)
 { 
   $Record = New-object PSObject -Property @{Name=$null;ID=$null}
   Foreach ($line in Get-Content $file.FullName)
    {
      switch -Regex ($_)
      {
       '^Name' {$Record.Name = ($_ -replace '^Name:(.+)$','$1').Trim()}
       '^ID'   {$Record.ID   = ($_ -replace '^ID:(.+)$','$1').Trim()}
      }
    }
    $Record
 }

无开关

$reg = [regex]"(^Name:.*)|(^Id:.*)"

gci c:\new*.txt | 
foreach {
          $matched = (gc reg_test0.txt) -match $reg -replace '^.+:\s*',''
           new-object psobject -Property @{Name=$matched[0];ID=$matched[1]} 
        }| Select Name,Id | Export-Csv c:\new\info.csv -NoTypeInformation