PowerShellのImport-Csvで取り込んだデータを再出力した際に列順が変わる場合、元CSVのヘッダーと出力前のプロパティ順を確認し、Select-Objectで出力列を明示すると再現性を高められます。処理の途中で別オブジェクトへ変換していないかも調べてください。

元CSVの見出し順を確認

入力CSVの最初の1行にあるヘッダーをテキストエディターで確認します。例として 注文ID,日付,金額 の順序を記録します。区切り文字や文字コードが異なると、順序以前に正しく列として取り込めない場合もあります。元ファイルはバックアップしてから、PowerShellで $rows = Import-Csv -LiteralPath '.\input.csv' -Encoding UTF8 と読み込みます。

取り込み後のプロパティを調べる

$rows | Select-Object -First 1 | Format-List * などでプロパティ名を確認します。Import-Csvだけの結果ではなく、途中のSelect-Object、Group-Object、新しい[pscustomobject]の組み立てなどが列順を変えていないか調べます。Format-Tableの結果をそのままExport-Csvへ流すと本来の列ではなく表示用の情報になるので避けてください。

Select-Objectで出力列順を固定

列を固定する例は次のとおりです。

$rows = Import-Csv -LiteralPath '.\input.csv' -Encoding UTF8
$rows | Select-Object 注文ID,日付,金額 |
    Export-Csv -LiteralPath '.\output.csv' -NoTypeInformation -Encoding UTF8

列名は入力に実在するものへ置き換えます。Windows PowerShell 5.1の-Encoding UTF8はBOM付きになる点に注意してください。出力先に元ファイルを指定せず、新規ファイルで比較します。

原本と出力CSVの見出しを照合

出力CSVのヘッダーが注文ID,日付,金額の順か、先頭と末尾のデータが欠けていないかを確認します。件数比較には $rows.Count と (Import-Csv .\output.csv).Count を使えます。ただしCSVの中身にカンマ・引用符・改行が含まれる場合はテキストの行数ではなくImport-Csvのレコード数で検査してください。

参考資料

おすすめの記事