使用PowerShell编辑CSV标头字段

时间:2014-01-10 16:22:46

标签: powershell csv

希望有人可以帮助解决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个字符。 此代码将删除详细信息,仅写入第一行。

任何帮助都会有所帮助,

感谢

2 个答案:

答案 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个字符以外的所有内容分组,以便可以在替换中使用。