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

时间:2015-03-30 20:54:00

标签: string powershell

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

______________________________________________________________________

.         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

I can output the first text line after each underscore

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

但是,我还想在每个下划线之后保留第一个文本行,同时输出每个拆分组中其余的文本行。但是每个组中的文本行数不确定,因此我无法使用-index 2,4,5,6。除此之外,我必须删除所有内容,直到每个文本行中的最后一个负数(不是行-index 2,这一行是每个组的名称),所以输出应该如下所示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

2 个答案:

答案 0 :(得分:2)

那怎么样?

(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

这很快,很脏,如果我们只是删除所有空行开始,它会更好地编码,但这确实有效。当我回到家时,我可能会整理一下。让我知道它是怎么回事。

第2轮

现在我还有一点时间试着清理一下。结果仍应与上述相同

(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+"匹配字符串开头的句点和后面的所有连续空格
  • ".*-"匹配所有内容,直到-
  • 的最后一次出现

答案 1 :(得分:2)

另一种选择:

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

这利用了字符串 - 将每个钻取规格集分隔成一个单独的字符串。在那之后,只需删除线条和字符,你就不需要插入空格来获得你想要的格式。