RegEx& Powershell:使用正则表达式根据CSV

时间:2015-09-03 15:14:06

标签: regex powershell

我正在尝试导入和处理CSV。从第三列的第2-4位开始,我想将该行写入具有该标识符的文件中。

作为一个例子,来自第1行的" results.csv"我正在尝试写一个名为" 274.txt"的文件。匹配线:

10.121.8.84,TRUE,N274SECX9010C5D,3/20/2015 15:48

我有点确定我的正则表达式可能是错的。它看起来很好,并且能够在Expresso中查看示例文本。但是,当添加到脚本时,我没有看到任何结果。

Results.csv:

10.121.88.84,TRUE,N274SECX9610C5D,3/20/2015 15:48
10.77.89.109,TRUE,L186OFFX2K6KMX1,3/24/2015 9:49
10.144.18.135,TRUE,N488FOOD2NK6MB1,3/25/2015 7:20
10.181.92.175,FALSE,,
10.147.86.54,FALSE,,

Powershell代码:

$path = Split-Path -parent $MyInvocation.MyCommand.Definition
$Results_File = $path + "\results.csv"

Import-Csv $Results_File | ForEach {
    If ($_ -Match '^.*,\w(?<filename>\d{3}).*') {
        $_ | Out-File -Append "$($Matches.Filename).csv"
    }
}

1 个答案:

答案 0 :(得分:4)

您应该将Import-Csv替换为Get-Content

$path = Split-Path -parent $MyInvocation.MyCommand.Definition
$Results_File = $path + "\results.csv"

get-content $Results_File | ForEach {
    If ($_ -Match '^.*,\w(?<filename>\d{3}).*') {
        $_ | Out-File -Append "$($Matches.Filename).csv"
    }
}

因为import-csv的结果给出了对象的结果,而不是你要在正则表达式中解析的内容。 您还可以尝试以下方法:

Import-Csv $Results_File -Header 'C1','C2','C3','C4'
C1            C2    C3              C4                                                  
--            --    --              --                                                  
10.121.88.84  TRUE  N274SECX9610C5D 3/20/2015 15:48                                     
10.77.89.109  TRUE  L186OFFX2K6KMX1 3/24/2015 9:49                                      
10.144.18.135 TRUE  N488FOOD2NK6MB1 3/25/2015 7:20                                      
10.181.92.175 FALSE                                                                     
10.147.86.54  FALSE 

然后使用$_.C3使用不同的RegEx。