[英]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.