PowerShellでCSVのカラムを抽出する際に、CSVファイルの形式違いでちょっとはまりました。
背景的には元データの行数が多すぎてExcelで処理が出来ないから。
ちなみに壁打ち相手はChatGPTなので、どんな質問したかとかもメモ。
したいこと
以下のようなCSVファイルの特定カラムを抽出したい。
※カンマ区切り、ダブルクォーテーションで括られている。
"Column1","Column2","Column3"
"Value1","Value2","Value3"
"Value1","Value2","Value3"
CSVファイルは同じフォルダに複数あり、結果は別ファイルに出力もしたい。
Get-Content
以下のようなコマンドを実行します。
Get-Content ./in_*.csv | Select-Object -Property Column2, Column3 -Unique | Out-File .\out.txt -append
処理内容は以下
-
Get-Content
でCSVの内容を読み取り -
Select-object
-Propertyでカラムの値を抽出- -uniqueで抽出した値から重複を配乗
-
Out-file
でファイルに出力。- -appendで追記モード。
ですが、出力結果は空でした…
ダメだったポイントは
- Select-object で指定するColumn2,3は2列目、3列目ではなく、Column2という列の名前
- ダブルクォーテーションで括られた値がGet-Contentでは正しく取得できない
ダブルクォーテーションについてはChatGPTに冒頭に示したようなCSVの中身を提示することで教えてもらえました。
Column2が行数じゃなくて名前であることは最後の最後まで気が付けませんでした…
Import-CSV
Get-Content
はファイルの指定にワイルドカードが利用できましたが、Import-CSV
でワイルドカード指定するとエラーに。
Import-CSV
はワイルドカード利用が出来ずに配列をForeachで回す必要がありました。
$files = Get-ChildItem .\in_*.csv
foreach ($file in $files) {
Import-Csv $file.FullName | Select-Object -Property Column2, Column3 -Unique | Out-File out.txt" -append
}
途中、配列をForeachで回す際に明らかにPowerShellじゃない構文だったので、指摘して修正してもらっています。
ChatGPT、コードスニペットの左上の言語のところ、かなりいい加減なことに気が付きました。
Get-Content と Import-CSVの違い
Get-Content
コマンドはその名前の通り、CSVやテキストだけでなく、様々形式のファイルを操作することが可能なようです。
Import-CSV
はCSVに特化しているので、Export-CSV
と組み合わせて活用するのがよさそうです。
参考