该文件包含大量数据,如下所示:
______________________________________________________________________
. 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.074I 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发布于 2015-03-30 21:42:46
那这个怎么样?
(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+"匹配字符串开头的句点和后面所有的连续空格".*-"匹配所有东西,直到最后一次出现-。发布于 2015-03-30 22:01:20
另一种选择:
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这利用了-将每个钻孔规范集分离成一个单独的字符串。在此之后,只需删除行和字符,您就不需要插入空格来获得您想要的格式。
https://stackoverflow.com/questions/29356077
复制相似问题