寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

Power Shellでヘッダーが重複したCSVを読み込む

なんか最近PowerShellを書いてます。こんにちは。

PowerShellには Import-Csv という便利なライブラリがいるんですが、ヘッダの値がそのままオブジェクトのプロパティになってしまうため、ヘッダーに重複した値があるとエラーが発生して読み込めません。

よしなにやってくれると嬉しいんですが、そのようなオプションがない(と思う)ので、頑張って解決してみます。

アプローチ

  • ヘッダ行を取得する。
  • 重複するヘッダがあった時にヘッダの別名を生成する

という感じでユニークなヘッダのデータを作成し、 Import-Csv に対し -Header オプションで渡します。めんどいですね。

コード

# csvファイルをShift-JISで読み込む
$StreamReader = New-Object System.IO.StreamReader("C:\data.csv", [Text.Encoding]::GetEncoding("Shift-JIS"))

# ヘッダをカンマ区切りでsplitし取得する
$Headers = $StreamReader.ReadLine() -Split "," | % { "$_".Trim() } | ? { $_ }

# 重複したヘッダは別名を付ける
For ($i=0; $i -lt $Headers.Count; $i++) {

    if ($i -eq 0) { Continue } # 最初のカラムはスキップ

    if ($Headers[0..($i-1)] -contains $Headers[$i]) {
        $Headers[$i] = "Header$i" # 個々のフォーマットで欲しいヘッダの形に
    }
}

# csvファイル読み込み
$csv = Import-Csv "data.csv" -Delimiter "," -Encoding Default -Header $Headers

$csv # output

2回もファイル読むの虚しいけど、こんな感じ。

まとめ

参考

Dealing with duplicate headers in .csv files in Powershell - Stack Overflow