使用Powershell将csv转换为tsv; Import-Csv失败

时间:2016-10-07 23:53:55

标签: powershell csv

我在文件夹中设置了 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   + ...桌面\采样数" | ForEach-Object {Import-Csv $ _。FullName |出口......   + ~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:NotSpecified:(:) [Import-Csv],ExtendedTypeSystemException       + FullyQualifiedErrorId:AlreadyPresentPSMemberInfoInternalCollectionAdd,Microsoft.PowerShell.Commands.ImportCs

如何解决此问题?

3 个答案:

答案 0 :(得分:3)

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

你可以找到CSV输出。

作为一种变通方法,您可以使用参数" -Header"指定表头:

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

答案 1 :(得分:1)

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

补充Paul's helpful answer

您收到的错误消息(member "<name>" is already present)告诉您 重复值存在于输入CSV文件的第1行 (正如woxxom在评论中也注明了这一点。)

Import-Csv要求输入文件的第1行包含列名 (必须是唯一的),并且数据行从第2行开始。

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

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

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

答案 2 :(得分:0)

试试这个

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