2017-06-10 163 views
0

重複列ヘッダーを持つPowerShellのcsvファイルで作業する必要があります。列が重複している理由は私の外にあります。それが人生だ。重複列ヘッダーを持つImport-Csv powershell

私は簡単にデータを扱うことができるようにインポート、CSVファイルを使用したいのですが、重複した列が存在するので、私はこのエラーを取得:私は手動ですべての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 

を重複した列を削除します。しかし、これは選択肢ではありません。何百もあり、スクリプトは定期的に実行する必要があります。理想的には、をプログラムで削除して(Import-Csvは動作しません)またはという名前で列のプログラム名を変更します(Import-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 

ショートバージョンのようにデータを変換することができます:あなたは自動あなたがmanuellyこの

gc "C:\temp\test.csv" | cfs -D "," -PropertyNames head1, head2, head3 | select -Skip 1 
のように名前を変更することができ、列の名前を変更したくない場合は

gc "C:\temp\test.csv" | cfs -D "," | 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 

1つの警告は、CSVファイル()ヘッダ行をカウントしていないデータのうちの少なくとも2つの行を有していなければならないということです。

関連する問題