我有一些这样的txt数据:
0.0.0.1_03_1
0.0.0.1_03
0.0.0.1_02_2_1_3_4
0.0.0.1_02_1
0.0.0.1_02
0.0.0.1_01_1
0.0.0.1_01
我要实现的是将两个变量分开(0.0.0.1和其余变量) 我只想除以第一个'_'并保留前导零(例如01) 我在做这样的事:
Get-Content $SourceTxtDbFile |
ConvertFrom-String -Delimiter "_" -PropertyNames DbVersion, ScriptNumber
但是结果既没有前导零,也没有按照我希望的方式分割线。
答案 0 :(得分:6)
使用.Split($separator, $count)
限制拆分数量,然后创建自己的输出对象:
Get-Content D:\test.txt | ForEach-Object {
$Left, $Right = $_.split('_', 2)
[PsCustomObject]@{
DbVersion = $Left.Trim()
ScriptNumber = $Right.Trim()
}
}
答案 1 :(得分:1)
TessellatingHeckler's helpful answer向您展示如何使用.Split()
方法执行基于分隔符的拆分,以限制返回的令牌数,在他的解决方案中,令牌仅拆分 1st _
实例,总共返回 2 个令牌。
顺便说一句:您还可以使用PowerShell自己的-split
运算符,其使用does have its advantages:
$_ -split '_', 2 # in this case, same as: $_.split('_', 2)
也就是说,您以后的评论建议您可能只是想从输入字符串中删除 2nd _
实例之后的所有内容。
$dbVersion, $scriptNumber, $null = $_ -split '_', 3 # -> e.g., '0.0.0.1', 03', '1'
请注意,如果我们对它不感兴趣,如何将$null
指定为变量以接收第三个令牌,从而有效地丢弃该令牌。
要使用_
重新加入生成的2个令牌,使用-join
运算符最简单:
$dbVersion, $scriptNumber -join '_'
将它们放在一起:
# Sample array of input lines.
$lines=@'
0.0.0.1_03_1
0.0.0.1_03
0.0.0.1_02_2_1_3_4
0.0.0.1_02_1
0.0.0.1_02
0.0.0.1_01_1
0.0.0.1_01
'@ -split '\r?\n'
# Use Get-Content $SourceTxtDbFile instead of $lines in the real world.
$lines | ForEach-Object {
# Split by the first two "_" and save the first two tokens.
$dbVersion, $scriptNumber, $null = $_ -split '_', 3
# Re-join the first two tokens with '_'and output the result.
$dbVersion, $scriptNumber -join '_'
}
使用示例输入,将产生:
0.0.0.1_03
0.0.0.1_03
0.0.0.1_02
0.0.0.1_02
0.0.0.1_02
0.0.0.1_01
0.0.0.1_01
答案 2 :(得分:0)
另一种RegEx方法:
> gc .\file.txt|?{$_ -match "^([^_]+)_(.*) *$"}|%{[PSCustomObject]@{DBVersion=$Matches[1];ScriptNumber=$Matches[2]}}
DBVersion ScriptNumber
--------- ------------
0.0.0.1 03_1
0.0.0.1 03
0.0.0.1 02_2_1_3_4
0.0.0.1 02_1
0.0.0.1 02
0.0.0.1 01_1
0.0.0.1 01
没有别名的情况相同
Get-Content .\file.txt|
Where-Object {$_ -match"^([^_]+)_(.*) *$"} |
ForEach-Object {
[PSCustomObject]@{
DBVersion = $Matches[1]
ScriptNumber= $Matches[2]
}
}
RegEx "^([^_]+)_(.*) *$"
还会从发布的示例行中删除尾随空格。