【问题标题】:With PowerShell, search a text file for multiple matches and grouping results使用 PowerShell,在文本文件中搜索多个匹配项和分组结果
【发布时间】:2018-07-17 03:59:32
【问题描述】:

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

Packslip 123000-01 07/16/18 运送到 添加1 添加2 添加3 市,州 国家邮编 [1。项目部件号] [项目描述] [项目数量] [2.项目部件号] [项目描述] [项目数量] [3.项目部件号] [项目描述] [项目数量] Packslip 321001-01 2018 年 7 月 16 日 运送到 添加1 添加2 添加3 市,州 国家邮编 [1。项目部件号] [项目描述] [项目数量]

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

我想从这个文本文件中得到如下内容:

[123000-01] [item1 部件号] [item qty] [123000-01] [item2 部件号] [item qty] [123000-01] [item3 部件号] [item qty] [321001-01] [item1 部件号] [item qty] ...等等...

括号可以忽略,它们仅用于此示例以帮助分隔数据元素。

使用Get-Content,我可以获得装箱单/订单号(即“123001-01”)就好了,但我似乎无法弄清楚如何获得[项目零件号]和[数量] 以使它们与正确的订单号相关联。

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

【问题讨论】:

  • Similar questions 之前被问过。请先进行自己的研究,尝试提出解决方案,然后在代码中出现无法按预期工作的特定内容时寻求有关 SO 的帮助。跨度>

标签: regex parsing powershell-4.0


【解决方案1】:

如果你没有真正的数据,但你提供的抽象,写东西有点难。我对您的数据做了以下假设:

  1. 项目 ID 不包含空格,后跟一个空格
  2. 数量不包含空格并且跟在空格后面
  3. packslip 编号和第一项之间的行数是固定的

如果这些假设是正确的,这应该有效:

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
}

我读入了 packslip 编号,然后我跳过了固定数量的行,然后我读取了后面的所有行,直到我遇到另一个 packslip 编号。

你这样调用脚本:

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

【讨论】:

    【解决方案2】:

    检查下一个sn-p。

    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)]"
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      相关资源
      最近更新 更多