2017-06-10 61 views
0

我需要在PowerShell中有重複的列標題的CSV文件的工作。他們有一個重複列的原因超出了我。這就是人生。進口-CSV PowerShell和重複的列標題

我想使用進口-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解決問題文件並刪除重複的列。但這不是一種選擇。有數百個,並且腳本需要定期運行。理想的情況是我在尋找一種方式來編程刪除列(進口-CSV將無法正常工作)或編程改變列的名字(讓我可以再進口CSV和刪除)。有什麼建議麼?

我的代碼遍歷所有文件:

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

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

你提前知道了報頭順序? –

+0

@ MathiasR.Jessen是的 – Thomas

+0

我可以使用'Get-Content $ file.FullName -First 1'從文件中獲取第一行(標題)。但我不知道如何修改/寫出到一個新的文件。 – Thomas

回答

3

您可以使用Header參數指定自定義標題名稱:

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

這將把原標題行作爲普通行,所以用Select-Object跳過第一個輸出對象:

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

可以裝載最新與獲取內容和轉換這樣

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 
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文件必須具有數據的至少兩排(不計算標題行)。