web-dev-qa-db-ja.com

Import-Csv-メンバーはすでに存在する問題

複数のCSVファイルを1つに結合する必要があります。各CSVにはヘッダーがあります。列ヘッダーの1つが同じです。理想的には、最終ファイル(all_out.csv)には単一のヘッダーが必要です。

PowerShellコードを実行します。

Import-Csv out_1_result.csv,out_2_result.csv,out_3_result.csv,out_4_result.csv,out_5_result.csv,out_6_result.csv,out_7_result.csv,out_8_result.csv,out_9_result.csv,out_10_result.csv,out_11_result.csv,out_12_result.csv,out_13_result.csv,out_14_result.csv,out_15_result.csv,out_16_result.csv,out_17_result.csv,out_18_result.csv,out_19_result.csv,out_20_result.csv,out_21_result.csv,out_22_result.csv,out_23_result.csv,out_24_result.csv,out_25_result.csv,out_26_result.csv,out_27_result.csv,out_28_result.csv |
    Export-Csv all_out.csv -NoType 

そして私はエラーになってしまいます

Import-Csv:メンバー「URL」はすでに存在しています。

これを無視/修正する方法はありますか?

6
Michael Asgian

列ヘッダーの1つが同じです

つまり、各CSVには2つの列ヘッダー「URL」がありますか? Import-Csvは、各ヘッダーがプロパティ名になるオブジェクトを作成します。 @{Id=10; Url='example.com'}と同じ名前を再度使用すると、競合します。

Import-Csvコマンドレットだけで「異なる列名を使用する」と「ヘッダー行をスキップする」ことはできないため、csvファイルを変更しないと、これが正しく機能する方法はありません。

私が考えることができる最も簡単な変更は、それぞれからヘッダー行を削除することです、例えば:

$CsvFiles = 'out_1_result.csv','out_2_result.csv','out_3_result.csv','out_4_result.csv','out_5_result.csv','out_6_result.csv','out_7_result.csv','out_8_result.csv','out_9_result.csv','out_10_result.csv','out_11_result.csv','out_12_result.csv','out_13_result.csv','out_14_result.csv','out_15_result.csv','out_16_result.csv','out_17_result.csv','out_18_result.csv','out_19_result.csv','out_20_result.csv','out_21_result.csv','out_22_result.csv','out_23_result.csv','out_24_result.csv','out_25_result.csv','out_26_result.csv','out_27_result.csv','out_28_result.csv'

$NewFileNames = $CsvFiles | ForEach-Object { 

    $NewFileName = $_ + "_noheader.csv"

    Get-Content $_ | Select-Object -Skip 1 | Set-Content $NewFileName -Encoding UTF8

    $NewFileName   # write new name to output stream

}

そして、ヘッダー行がない場合は、すべてインポートして、ヘッダー行をパラメーターとして指定します。

Import-Csv -Path $NewFileNames -Header 'Col1', 'Col2', 'Url1', 'Url2' | Export-Csv ...
8