在Powershell .csv文件中使用重复的标头

时间:2015-10-01 16:10:47

标签: powershell csv

我有一个.csv文件,我想将它导入powershell,然后遍历文件更改某些值。然后我希望输出附加到原始.csv文件,以便更新值。

我的问题是.csv文件包含的标题并不是唯一的,并且无法更改,因为它不会在另一个程序中运行。最初我在powershell中定义了自己的头文件以解决这个问题,但是当输出文件需要旧头文件时,它会有这些新头文件。

我也尝试了ConvertFrom-Csv,这意味着我无法再访问我需要的列,因此会出现大量的运行时错误。

最理想的是能够使用已定义的列标题然后转换回原始列标题。我目前的代码如下:

$csvfile = Import-Csv C:\test.csv| Where-Object {$_.'3' -eq $classID} | ConvertFrom-Csv
foreach($record in $csvfile){
*do something*}
$csvfile | Export-Csv -path C:\test.csv -NoTypeInformation -Append

我现在已经在网上搜索了几个小时,并尝试了我遇到过的所有内容,但都无济于事。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

这是一种有点愚蠢的实施,但应该有效。

  1. 将所有标题删除为一行并将其保存在某处
  2. 解析新结果集(删除标题)
  3. 完成后在顶部添加行
  4. CSV是逗号分隔文件,您不必将其视为结构化数据。随意拼接和骰子。

答案 1 :(得分:0)

由于您事先知道输入CSV文件中有多少列,因此您可以在内部导入而不使用标题和进程。例如:

$columns = 78

Import-Csv "inputfile.csv" -Header (0..$($columns - 1)) | Select-Object -Skip 1 | ForEach-Object {
  $row = $_
  $outputObject = New-Object PSObject
  0..$($columns- 1) | ForEach-Object {
    $outputObject | Add-Member NoteProperty "Col$_" $row.$_
  }
  $outputObject
} | Export-Csv "outputfile.csv" -NoTypeInformation

此示例生成新的PSObject,然后输出具有通用列名称(Col0,Col1等)的新CSV文件。