替换文件中的CSV标头

时间:2017-11-10 07:05:21

标签: powershell

我使用Set-Content替换CSV文件中的标题,它会替换标题,但它也会清除标题下方的所有数据行。

有没有办法对代码进行编码,以便在更换标题后我不会丢失数据?

$Location = "$home\performance2.csv"

$PreformHeaderRow1 =@()
$PreformHeaderRow2 =@{}

$PreformHeaderRow1 = (Get-Content $Location | Select-Object
-First 1).Split(",")
$PreformHeaderRow1 | % {
$PreformHeaderRow2.Add($_ -replace '"',"" ) 
}

$NewHeaders =@()  
ForEach($objectA in $HeaderLookup.Keys){
     ForEach($objectB in $PreformHeaderRow2.Keys){
         if($objectA -eq $objectB){
           $NewHeaders+= $HeaderLookup[$objectA]
         }
     }
 }

[string]$a = $NULL
$a = $NewHeaders -join ""","""
$a | Set-Content -First 1 $Location

2 个答案:

答案 0 :(得分:0)

Set-Content没有像-First这样的Get-Content个参数,它只是用Value参数的内容覆盖文件,就像你传递的所有内容一样这是所有文件更新的第一行。

您可以按索引$content[0]选择第一行,在使用$content[0] = $NewHeaders -join '","'之前仅替换其值Set-Content

$Location = "$home\performance2.csv"

$PreformHeaderRow1 =@()
$PreformHeaderRow2 =@{}

$content = Get-Content $Location

$PreformHeaderRow1 = $content[0].Split(",")
$PreformHeaderRow1 | % {
    $PreformHeaderRow2.Add($_ -replace '"',"" ) 
}

$NewHeaders =@()  
ForEach($objectA in $HeaderLookup.Keys){
     ForEach($objectB in $PreformHeaderRow2.Keys){
         if($objectA -eq $objectB){
           $NewHeaders+= $HeaderLookup[$objectA]
         }
     }
 }

$content[0] = $NewHeaders -join '","'
$content | Set-Content $Location

答案 1 :(得分:0)

如果您只想在其上方添加固定内容的行,则可以执行以下操作:

$output = "C:\temp\t.csv"
$Content = Get-Content $output
$add_above_all_else = 'header1;header2;header3;header4;header5'
Set-Content $output -value $add_above_all_else,$content

这样可以保留所有行,但只需在固定标题上方添加一行。