我需要使用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
}
答案 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文件必须至少有两行数据(不计算标题行)。