4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PowerShellでCSVのカラムを抽出する(Get-Content,Import-Csv)

Posted at

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と組み合わせて活用するのがよさそうです。

参考

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?