首页 > 解决方案 > Powershell - 查询 CSV 列名并将它们写入新的 CSV

问题描述

所以我试图查看 CSV 中的列名,将它们写入一个数组,然后将数据吐回一个新的 CSV 并附加一个新列。只要我可以在标题中添加一列,我并不真正关心当前数据表的外观。这似乎是一件相当基本的事情,但我似乎找不到任何人这样做的情况。例如:

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

我只想保留名称、位置和电话列名称,并将它们放入另一个带有一个额外列的 CSV。问题是,实际上,有更多的列并且它们并不总是相同的,因此脚本需要能够与列名无关。我应该能够为它提供具有任意数量的具有不同名称的列的任何 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 时,它都会在新行中为每个或其他一些愚蠢的东西提供字符长度计数。

谢谢

标签: powershellcsvexport-to-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"

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


推荐阅读