Powershell - 查询 CSV 列名称并将它们写入新的 CSV

Powershell - Querying CSV column names and writing them to a new CSV

所以我试图查看 CSV 中的列名,将它们写入数组,然后将数据吐回新的 CSV 中,并附加一个新的列。我真的不在乎当前数据 table 是什么样子,只要我可以向 headers 添加一列即可。这似乎是一件相当基本的事情,但我似乎找不到任何人这样做过的情况。例如:

"Name","Location","Phone"
"John Smith","Toronto","555.555.5555"
"Jane Doe","Dallas","555.555.5554"

我只想保留名称、位置和 Phone 列名称,并将它们放入另一个 CSV 文件中并增加一个列。问题是,实际上,有更多的列并且它们并不总是相同的,因此脚本需要能够成为列 name-agnostic。我应该能够为它提供任何 CSV 文件,其中包含任意数量的不同名称的列,并且能够获得仅包含列名的输出文件。我已经尝试了至少十几种不同的方法来做到这一点,并不断遇到不同的问题。

示例:

$validatedfilepath = "validfile.csv"
$csvData = New-Object PSObject
$csvData = Import-CSV "file.csv" | Add-Member @{ID="$null"} -PassThru
$csvdata = $csvdata | get-member -Name * -MemberType NoteProperty
$csvData = @($csvData.Name)
$csvData

这将向我显示我在新的有效文件中所需的列名的确切列表,但我不知道如何将其作为列名导出到 CSV 文件中。每次我尝试做 export-csv 时,它都会在新行中为每个或其他一些愚蠢的东西提供字符长度计数。

谢谢

Export-CSV 从输入对象的成员中读取列名。所以你已经在正确的轨道上了,你只需要简化一点,像这样:

$csvData = Import-CSV "file.csv" | Add-Member @{ID="$null"} -PassThru
# You can now modify/enrich/filter the data somehow, for example like $csvdata[0].ID = 56387, then just export it:
$csvData | Export-CSV -NoTypeInformation -Path "newfile.csv"

您犯的错误是用 Get-Member 结果覆盖 $csvdata 中导入的数据。然后用 @($csvData.Name) 表达式再次覆盖它。