String 拆分多行字符串组并输出选定字段
该文件包含大量数据,如下所示:String 拆分多行字符串组并输出选定字段,string,powershell,String,Powershell,该文件包含大量数据,如下所示: ______________________________________________________________________ . 1-9/16 TCS DRILL . CUT = +2.685 / O/A = -2.685 . +2.685 / -2.685 . +3.935 / -3.935
______________________________________________________________________
. 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
但是,我还希望在每个下划线行之后保留第一行文本,同时在每个分割组中输出其余文本行。但是每组的文本行数不确定,因此我不能使用-索引2,4,5,6
。除此之外,我必须删除所有内容,直到每个文本行中的最后一个负数(不是行-索引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
那么这个怎么样
(获取内容-原始$file)-拆分“+”|其中对象{$}| ForEach对象{
$entry=$\分割“`r`n”
($entry | Select-索引2)-替换“^\。\s+”
$entry | Select-跳过3 |其中对象{$|}ForEach对象{
-$(($)-split“-”号[-1].Trim())
}
}
我们所做的和以前一样。输出文件中的“工具”行。现在,我们处理每组剩余的每一行。对于不是空的行,我们只是根据减号将字符串拆分成一个数组。每行的最后一个元素[-1]
应该是您正在查找的值,我们将-
静态添加回字符串。使用.Trim()
为我们清理间距
样本输出
1-9/16 TCS钻机
-2.685
-2.685
-3.935
1-11/32 TCS钻机
-3.237
-3.237
-4.487
1-11/32 TCS钻机
-5.699
1-1/8 TCS钻机
-1.553
-2.338
-2.513
这是快速和肮脏的,如果我们只是删除所有的空行开始,将更好地编码,但这确实工作。我到家后可能会把它整理一下。让我知道你的情况
第二轮
现在我有了更多的时间,我试着清理一下。结果仍应与上述相同
(获取内容-原始$file)-拆分“+”|其中对象{$}| ForEach对象{
$entry=$\.Split('r`n',[StringSplitOptions]::RemoveEmptyEntries)-替换“^\.\s+”
$entry[0]
($entry |选择对象-跳过1)-替换“*-”,“-”
}
这次使用[StringSplitOptions]::removeMptyEntries
删除空条目,这样我就不必猜测哪一行包含项目字符串。另外,由于-replace
在数组上工作,因此我们可以使用它,而无需使用更多的ForEach
循环。至于最后两个正则表达式字符串:
匹配字符串开头的句点和其后的所有连续空格“^\.\s+”
匹配所有内容,直到最后一次出现“*-”
-
那么这个怎么样
(获取内容-原始$file)-拆分“+”|其中对象{$}| ForEach对象{
$entry=$\分割“`r`n”
($entry | Select-索引2)-替换“^\。\s+”
$entry | Select-跳过3 |其中对象{$|}ForEach对象{
-$(($)-split“-”号[-1].Trim())
}
}
我们所做的和以前一样。输出文件中的“工具”行。现在,我们处理每组剩余的每一行。对于不是空的行,我们只是根据减号将字符串拆分成一个数组。每行的最后一个元素[-1]
应该是您正在查找的值,我们将-
静态添加回字符串。使用.Trim()
为我们清理间距
样本输出
1-9/16 TCS钻机
-2.685
-2.685
-3.935
1-11/32 TCS钻机
-3.237
-3.237
-4.487
1-11/32 TCS钻机
-5.699
1-1/8 TCS钻机
-1.553
-2.338
-2.513
这是快速和肮脏的,如果我们只是删除所有的空行开始,将更好地编码,但这确实工作。我到家后可能会把它整理一下。让我知道你的情况
第二轮
现在我有了更多的时间,我试着清理一下。结果仍应与上述相同
(获取内容-原始$file)-拆分“+”|其中对象{$}| ForEach对象{
$entry=$\.Split('r`n',[StringSplitOptions]::RemoveEmptyEntries)-替换“^\.\s+”
$entry[0]
($entry |选择对象-跳过1)-替换“*-”,“-”
}
这次使用[StringSplitOptions]::removeMptyEntries
删除空条目,这样我就不必猜测哪一行包含项目字符串。另外,由于-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
这利用了字符串-将每个钻孔规范集分离为一个单独的字符串。之后,只需删除您不需要的行和字符,插入空格即可获得您想要的格式。另一个选项:
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
这利用了字符串-将每个钻孔规范集分离为一个单独的字符串。之后,只需删除您不需要的行和字符,插入空格即可获得您想要的格式。@Matt再次发布。“提前谢谢!”马特再次发帖。提前谢谢。谢谢@mjolinor,你的答案也很有效,但我还是投票给Matt作为最佳答案,因为它有更详细的解释,让我更容易理解。:)没问题。马特的也可以。它唯一的实质性优势是,它可以轻松地扩展到非常大的文件,因为您不是h