使用PowerShell,在文本文件中搜索多个匹配项和分组结果

时间:2018-07-17 03:59:33

标签: regex parsing powershell-v4.0

我不确定该怎么说。无论如何,我有一个这样的“订单”文件:

Packslip 123000-01    07/16/18
ship to
add1
add2
add3
city, state
country zip
[1. item part number] [item description] [item qty]
[2. item part number] [item description] [item qty]
[3. item part number] [item description] [item qty]
Packslip 321001-01    07/16/18
ship to
add1
add2
add3
city, state
country zip
[1. item part number] [item description] [item qty]

每个订单都从以“ Packslip”开头的行开始。 每个订单可以有任意数量的商品。

我想从这个文本文件中得到的东西是这样的:

[123000-01] [item1 part number] [item qty]
[123000-01] [item2 part number] [item qty]
[123000-01] [item3 part number] [item qty]
[321001-01] [item1 part number] [item qty]
...and so on...

括号可以忽略,仅在此示例中才有用,以帮助分隔数据元素。

使用Get-Content,我可以很好地获得装箱单/订单号(即“ 123001-01”),但是我似乎无法弄清楚如何获得[物品部件号]和[数量]以与正确的订单号绑定的方式。

我的问题是:我如何去搜索该文本文件并根据可变模式和可变结果对结果进行分组?

2 个答案:

答案 0 :(得分:0)

如果您没有真实的数据,但是只有您提供的抽象,那么编写某些内容就会有些困难。我对您的数据做了以下假设:

  1. 商品ID不包含空格,后跟空格
  2. 数量不包含空格,并且遵循空格
  3. 装箱单号和第一项之间的行数是固定的

如果这些假设是正确的,那么这应该起作用:

param (
    [string]$in = "example.txt",
    [string]$out = "out.txt"
)
if(Test-Path $out -PathType Leaf){
    Clear-Content $out
}

$packslip_regex = "Packslip.*"
$line_number = 0 

foreach($line in Get-Content $in) {
    if($line -match $packslip_regex){
        $packslip_number = $line.Split(" ")[1]
        $line_number = 0
    }

    if($line_number -gt 6){
        $item = $line.Split(" ")
        $item_id = $item[0]
        $item_number = $item[$item.Count - 1]
        $out_string = "$packslip_number $item_id $item_number"
        $out_string | Out-File $out -Append
    }

    $line_number = $line_number + 1
}

我读了纸条编号,然后跳过了固定的行数,然后读了随后的所有行,直到打出另一个纸条编号。

您这样调用脚本:

.\script.ps1 -in example.txt -out output.txt

答案 1 :(得分:0)

检查下一个代码段。

foreach($line in Get-Content C:\packslips.dat){
  if ($line -match '^Packslip\s+(?<packslip>\S+).*$') {
    $packslip = $matches.packslip
  } elseif ($line -match '^\d+.\s+(?<partnumber>\S+).*\b(?<itemqty>\d+)\s*$') {
    "[${packslip}] [$($matches.partnumber)] [$($matches.itemqty)]"
  }
}