希望有人可以帮助解决PowerShell问题。 我有这样的文件
test1.dat
H,customername,4110,001,69,001
d,item,desc,number
d,item,desc,number
d,item,desc,number
我想做的是将第3列(4110)的左3位替换为最后一列(001)
所以它会是这样的:
H,customername,4110,001,69,411
d,item,desc,number
d,item,desc,number
d,item,desc,number
我只想修改标题而不是细节。我试过下面的代码。
$file = "C:\files\test1.dat"
(Get-Content $file)[0 .. 0] | Foreach-Object {$_ -replace "411", "001"} |
Set-Content $file
这个问题是 我还没有找到一种方法来使用替换左字符串来获取字段中的前3个字符。 此代码将删除详细信息,仅写入第一行。
任何帮助都会有所帮助,
感谢
答案 0 :(得分:2)
导入文件:
$file = "C:\files\test.dat"
$dat = get-content $file
选择第一行:
$headers = $dat | select -first 1
将第一行拆分为数组:
$headers = $headers -split ","
将最后一个标题替换为第三个标题的前3个字符:
$headers[5] = $headers[2].Substring(0,3)
再次将数组连接在一个字符串中,值以逗号分隔:
$headers = $headers -join ","
将文件的第一行设置为已连接的字符串:
$dat[0] = $headers
输出文件:
$dat | set-content $file
答案 1 :(得分:2)
这样的事情应该有效:
$file = "C:\files\test1.dat"
$data = Get-Content $file
($data | select -First 1) -replace '^((?:.*?,){2}(...).*)...$', '$1$2' |
Out-File $file
$data | select -Skip 1 | Out-File $file -Append
正则表达式细分:
^(?:.*?,){2}
匹配标题行的前两个字段(...)
匹配接下来的3个字符并将其捕获到一个组中...$
匹配最后3个字符 .*
和^(?:.*?,){2}(...)
之间的...$
匹配3 rd 字段的前3个字符与最后3个字符之间的标题行的其余部分的字符串。外括号将除最后3个字符以外的所有内容分组,以便可以在替换中使用。