【问题标题】:convert csv to tsv using Powershell; Import-Csv fails使用 Powershell 将 csv 转换为 tsv;导入 CSV 失败
【发布时间】:2016-10-07 23:53:55
【问题描述】:

我在一个文件夹中有一组 CSV 文件。我想将文件转换成 TSV 文件格式。我想用Powershell 做同样的事情。

我尝试使用以下脚本。它正在抛出错误。

Get-ChildItem "C:\Users\myname\Desktop\sampledata" | ForEach-Object { Import-Csv $_.FullName | Export-Csv {$_.Name} -Delimiter "`t" -Encoding UTF8 }

我收到类似于以下的错误:

Import-Csv:成员“1”已经存在。在行:8 字符:72 + ... Desktop\sampledata" | ForEach-Object { Import-Csv $_.FullName | Expor ... + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Import-Csv], ExtendedTypeSystemException + FullyQualifiedErrorId : AlreadyPresentPSMemberInfoInternalCollectionAdd,Microsoft.PowerShell.Commands.ImportCs

我该如何解决这个问题?

【问题讨论】:

  • {$_.Name} 是一个脚本块。删除{} 或使用(Join-Path 'c:\somewhere' $_.Name)
  • 是的。我删除了它。仍然面临同样的问题。我认为这与Import-csv 有关
  • 显然您的 CSV 文件有重复的字段名称。
  • 是的。你说的对。我也选择了相应的答案。

标签: powershell csv


【解决方案1】:

该 csv 文件第一行的单元格中存在错误指示的相同值。这是命令 import-csv 的正常行为。

你可以找到那个CSV出来的。

作为一种解决方法,您可以使用参数“-Header”指定表头:

Import-Csv xxx.csv -Header a,b,c,d

【讨论】:

    【解决方案2】:

    在撰写本文时,该问题包含一个额外的偶然错误:{$_.Name} 用于指定输出文件名:但是,{$_.Name} 是一个 脚本块,它在string context 评估为它的 literal 内容,即 literal $_.Name。相比之下,目的是将当前管道对象 ($_) 的 Name 属性指定为文件名:$_.Name 本身就可以 - 不需要引用或其他限定(尽管 "$($_.Name)" 也可以工作, 在双引号字符串内)。

    补充Paul's helpful answer

    您收到的错误消息 (member "<name>" is already present) 告诉您输入 CSV 文件的第一行中存在重复值(正如woxxom 在对该问题的评论中所指出的那样)。

    Import-Csv 期望输入文件的第一行包含列名(必须是唯一的)和数据行 从第 2 行开始。

    • 列名成为 PowerShell 从数据行构造的对象的属性(成员),并且一个对象(类)不能有多个同名的属性。

    听起来您的输入文件缺少列名,因此您可以使用 Import-Csv -Header <colName1>, <colName2>, ... 临时指定列名。

    • 如果您指定的列名比数据列少,多余的列将被忽略
    • 如果您指定更多列名称而不是数据列,则会创建其他属性,但它们的值将是$null

    【讨论】:

      【解决方案3】:

      试试这个

      Get-ChildItem c:\temp\ -Filter "*.csv" | foreach{(Import-Csv $_.FullName -Delimiter ";") | export-csv $_.FullName -NoTypeInformation -Delimiter "`t" -Encoding UTF8}
      

      【讨论】:

      • 除了将输入分隔符更改为; 并添加-NoTypeInformation - OP 都没有要求 - 您的解决方案基本上与 OP 自己尝试的相同。请注意,即使输入分隔符有问题,也不会导致 OP 描述的症状。
      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2017-09-21
      相关资源
      最近更新 更多