【问题标题】:Powershell - Querying CSV column names and writing them to a new CSVPowershell - 查询 CSV 列名并将它们写入新的 CSV
【发布时间】:2018-10-11 00:35:25
【问题描述】:

所以我试图查看 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 时,它都会在新行中为每个或其他一些愚蠢的东西提供字符长度计数。

谢谢

【问题讨论】:

  • 您想创建一个只有标题行的“空”CSV 文件?做什么的?在 Powershell 中,您通常只需将结构化数据导出到 CSV 文件中,Powershell 就会为您创建必要的标头。
  • 我不明白你想做什么。您的输出 csv 应该是什么样的?
  • 我现在才注意到您使用了 2 个不同的文件名。你这样做是有目的的吗?
  • @Olaf - 我实际上并没有尝试创建一个空的 csv 文件,但这就是我的目标。这似乎比尝试动态添加新列更合理。我需要获取相关列,添加 ID 列并添加值并输出到新文件。如果我至少可以让列名正确,那将使我更接近最终目标。
  • @TToni - 所以我展示的示例 CSV 数据,想象加上一列与正在修改的行相对应的数据。我不想碰原始文件。导入的 csv 文件可能没有新列的相应数据,因此我想将这些行分开到不同的文件中。

标签: powershell csv export-to-csv


【解决方案1】:

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) 表达式再次覆盖它。

【讨论】:

  • "$null" -> ""
  • 谢谢@TToni,这是我需要的答案
猜你喜欢
  • 2020-03-28
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2013-10-04
  • 2016-08-01
相关资源
最近更新 更多