在powershell中将文本行解析为两个变量

时间:2015-01-22 21:27:28

标签: arrays parsing powershell csv ip-address

我有一个格式如下的测试文件:

    <IPADDRESS1> # <STRINGA>
    <IPADDRESS2> # <STRINGB>
    <IPADDRESS3> # <STRINGA;STRINGB>

有时会有多个字符串以&#34;;&#34;

分隔

我想在PowerShell中做的是将其解析为每个IP / String组合的数组并输出到CSV

期望的输出:

    IPAddress1,STRINGA
    IPAddress2,STRINGB
    IPAddress3,STRINGA
    IPAddress3,STRINGB

我目前使用PowerShell的这个问题是当我将其分割为分割时,我无法让ForEach将IP地址部分传递到带有辅助字符串的新行:

get-content C:\file.txt | %{$_ -replace " # ",""} | %{$_ -split ";"}

此示例中的输出:

    IPAddress1,STRINGA
    IPAddress2,STRINGB
    IPAddress3,STRINGA
    STRINGB

请注意,这是缺少最后一行的IP地址。

我的想法是我需要将每行文本读入某种解析函数来处理地址和字符串并构建一个数组,以便将此数组输出到csv。

任何帮助都会很棒,如果有更简单的方法,请告诉我。我只限于powershell。

2 个答案:

答案 0 :(得分:2)

使用您的测试数据(无法确定那些&lt;&gt;是否应该是数据的一部分):

$text = 
'IPADDRESS1 # STRINGA',
'IPADDRESS2 # STRINGB',
'IPADDRESS3 # STRINGA;STRINGB'

$text | foreach {
$Address,$Strings = $_.split('#').trim()
Foreach ($String in $Strings.split(';'))
 {"$Address,$String" }
}


IPADDRESS1,STRINGA
IPADDRESS2,STRINGB
IPADDRESS3,STRINGA
IPADDRESS3,STRINGB

答案 1 :(得分:0)

这是你想要做的吗?

Get-Content C:\file.txt | % { 
    if($_ -match '<(.*?)>\s+#\s+<(.*?)>') {
        $Matches[2] -split ';' | % { "$($Matches[1]),$_" }
    } else { Write-Host "Line '$_' doesn't match regex" }
}

IPADDRESS1,STRINGA
IPADDRESS2,STRINGB
IPADDRESS3,STRINGA
IPADDRESS3,STRINGB