繁体   English   中英

分割多行字符串组并输出所选字段

[英]Splitting multi-line string groups and outputting selected fields

该文件包含大量数据,如下所示:

______________________________________________________________________

.         1-9/16 TCS DRILL                  

.          CUT = +2.685 / O/A = -2.685
.                +2.685 /       -2.685
.                +3.935 /       -3.935


______________________________________________________________________

.         1-11/32 TCS DRILL                  

.          CUT = +0.9 / O/A = -3.237
.                +0.9 /       -3.237
.                +0.9 /       -4.487


______________________________________________________________________

.         1-11/32 TCS DRILL                  

.          CUT = +5.699 / O/A = -5.699


______________________________________________________________________

.         1-1/8 TCS DRILL                  

.          CUT = +1.553 / O/A = -1.553
.                +2.338 /       -2.338
.                +2.513 /       -2.513


______________________________________________________________________

.         1-1/16 TCS DRILL                  

.          CUT = +3.587 / O/A = -8.074

我可以在每个下划线后输出第一个文本行

(Get-Content -Raw $file) -split "_+" | 
    Where-Object{$_} | 
ForEach-Object{($_ -split "`r`n" | Select -Index 2) -replace "^\.\s+"}

但是,我还要保留每个下划线之后的第一行文本,并在每个拆分组中输出其余的文本行。 但是每组中的文本行数不确定 ,因此我不能使用-index 2,4,5,6 除此之外,我必须删除所有内容,直到每个文本行中的最后一个负数 (而不是-index 2行,此行都是每个组的名称),因此输出应在以下两列中如下所示:

1-9/16 TCS DRILL
                    -2.685
                    -2.685
                    -3.935
1-11/32 TCS DRILL
                    -3.237
                    -3.237
                    -4.487
1-11/32 TCS DRILL
                    -5.699
1-1/8 TCS DRILL
                    -1.553
                    -2.338
                    -2.513

那呢?

(Get-Content -Raw $file) -split "_+" | Where-Object{$_} | ForEach-Object{    
    $entry = $_ -split "`r`n" 

    ($entry | Select -Index 2) -replace "^\.\s+"
    $entry | Select -Skip 3 | Where-Object{$_} | ForEach-Object{
        "-$(($_ -split "-")[-1].Trim())"
    }
}

我们所做的与以前相同。 在文件中输出该“工具”行。 现在,我们处理每个组的其余各行。 再次选择不为空的行,我们只是基于减号将字符串分成一个数组。 每行的最后一个元素[-1]应该是您要寻找的值,我们会将-静态加回到字符串中。 使用.Trim()为我们清理间距。

样本输出

1-9/16 TCS DRILL                  
-2.685
-2.685
-3.935
1-11/32 TCS DRILL                  
-3.237
-3.237
-4.487
1-11/32 TCS DRILL                  
-5.699
1-1/8 TCS DRILL                  
-1.553
-2.338
-2.513

这是快速而又肮脏的,如果我们刚开始删除所有空行,则将得到更好的编码,但这确实可行。 当我回到家时,我可能会整理一下。 让我知道您的情况。

第二回合

现在,我有更多时间尝试清理一下。 结果应仍与上述相同

(Get-Content -Raw $file) -split "_+" | Where-Object{$_} | ForEach-Object{
    $entry = $_.Split("`r`n",[StringSplitOptions]::RemoveEmptyEntries) -replace "^\.\s+"
    $entry[0]
    ($entry | Select-Object -Skip 1) -replace ".*-","-"
}

这次使用[StringSplitOptions]::RemoveEmptyEntries删除空条目,因此我不必猜测哪一行包含项目字符串。 另外,由于-replace可在数组上使用,因此我们可以使用它而无需更多的ForEach循环。 至于最后两个正则表达式字符串:

  • "^\\.\\s+"匹配字符串开头的句点和随后的所有连续空格
  • ".*-"匹配所有内容,直到最后一次出现-

另外一个选项:

Get-Content $file -Delimiter ('_'*70) |
foreach {
   $_.split("`n") -match '\.+' -replace '^\.\s+' -replace '.+\s(-[0-9.]+)',"$(' '*20)`$1"
  }

使用样本数据输出:

1-9/16 TCS DRILL
                    -2.685
                    -2.685
                    -3.935
1-11/32 TCS DRILL
                    -3.237
                    -3.237
                    -4.487
1-11/32 TCS DRILL
                    -5.699
1-1/8 TCS DRILL
                    -1.553
                    -2.338
                    -2.513
1-1/16 TCS DRILL
                    -8.074

这利用了字符串-将每个钻探规格集分成一个单独的字符串。 之后,只需要删除行和字符,就不需要插入空格来获得所需的格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM