Import-Csv powershell包含重复的列标题

时间:2017-06-10 20:01:24

标签: powershell csv

我需要使用PowerShell中具有重复列标题的csv文件。他们有重复专栏的原因超出了我的范围。这就是生活。

我想使用Import-Csv以便我可以轻松处理数据,但由于重复列存在,我收到此错误:

Import-Csv : The member "PROC STAT" is already present.
At C:\Users\MyName\Documents\SomeFolder\testScript1.ps1:10 char:9
+ $csv2 = Import-Csv $files[0].FullName
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Import-Csv], ExtendedTypeSystemException
    + FullyQualifiedErrorId : AlreadyPresentPSMemberInfoInternalCollectionAdd,Microsoft.PowerShell.Commands.ImportCsvCommand

我可以通过进入每个csv文件并删除重复列来手动修复问题。但这不是一种选择。它们有数百个,脚本需要定期运行。理想情况下,我正在寻找一种方法以编程方式删除该列(Import-Csv将无效)或以编程方式更改列的名称(以便我可以导入-Csv并删除它)。有什么建议吗?

我的代码循环遍历所有文件:

$files = Get-ChildItem "C:\Users\MyName\Documents\SomeFolder\Data" -Filter *.csv

foreach($file in $files) {
    $csv = Import-Csv $file.FullName
}

3 个答案:

答案 0 :(得分:3)

您可以使用Header参数指定自定义标题名称:

Import-Csv .\file.csv -Header header1,header2,header3

这会将原始标题行视为普通行,因此使用Select-Object跳过第一个输出对象:

Import-Csv .\file.csv -Header header1,header2,header3 |Select-Object -Skip 1

答案 1 :(得分:0)

您可以使用get-content加载日期并像这样转换数据

Get-Content "C:\temp\test.csv" | ConvertFrom-String -Delimiter "," | select -Skip 1

简短版本:

gc "C:\temp\test.csv" | cfs -D "," | select -Skip 1

如果你不想重命名自动列,你可以像这样重命名manuelly

gc "C:\temp\test.csv" | cfs -D "," -PropertyNames head1, head2, head3 | select -Skip 1

答案 2 :(得分:0)

以下是如何执行此操作的示例,无需对代码中的列标题名称进行硬编码(即,根据CSV文件中的列数动态生成通用标头):

$csvFile = "test.csv"

# Count columns in CSV file
$columnCount = (Get-Content $csvFile |
  Select-Object -Index 1,2 |
  ConvertFrom-Csv |
  Get-Member -MemberType NoteProperty |
  Measure-Object).Count

# Create list of generic property names (no duplicates)
$propertyNames = 1..$columnCount |
  ForEach-Object { "Property{0}" -f $_ }

# Get CSV file content, skip header line, and convert from CSV using generic header
Get-Content $csvFile |
  Select-Object -Skip 1 |
  ConvertFrom-Csv -Header $propertyNames

此解决方案的一个警告是CSV文件必须至少有两行数据(不计算标题行)。