なんか最近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回もファイル読むの虚しいけど、こんな感じ。
まとめ
- はてなのsyntax highlightにPowerShellなかった。(涙
参考
Dealing with duplicate headers in .csv files in Powershell - Stack Overflow