定期的に行う簡単なテキスト整形ってコマンドでやった方が楽ですよね。っていうか手でやってるの?ほげーってなるのですが、Linux の環境であれば awk とか sed を使えばシンプルにテキストデータの操作ができるのに、Powershell ってなんか大変。。。慣れていないの一言につきるのですが、Powershell でCSVを編集しないといけないことがあったのでやり方をまとめておきます。
Powershell で CSV 操作
やりたかったこと
としては、編集して上書き。Powershell CSV初心者としてはいろいろつまづいたので基本操作からメモしておきます。
表示
まずは、データ内容を確認します。単にcatで表示させた状態。
1 2 3 4 5 6 |
> cat .\test.csv # NAME_LIST Name,Age,Country json,23,America yamada,31,Japan adam,19,France |
↑のデータをCSVとして表示すると以下のようになる。エイリアスは ipcsv 。
1 2 3 4 5 6 7 |
> Import-Csv .\test.csv Name Age Country ---- --- ------- json 23 America yamada 31 Japan adam 19 France |
編集するために、一旦 変数に格納 する必要がある。
1 2 3 4 5 6 7 8 |
> $a=ipcsv .\test.csv > $a Name Age Country ---- --- ------- json 23 America yamada 31 Japan adam 19 France |
Name列のみ表示させてみる。
1 2 3 4 |
> $a | ForEach-Object { $_.name } json yamada adam |
Name列が「yamada」の行のみ表示させる。
1 2 3 4 5 |
> $a | Where-Object { $_.name -eq "yamada" } Name Age Country ---- --- ------- yamada 31 Japan |
※演算子は -match でもいける。
1 2 3 4 5 |
> $a | Where-Object { $_.name -match "yamada" } Name Age Country ---- --- ------- yamada 31 Japan |
編集
では、編集していきます。
「yamada」の名前を 31 → 38 に変更してみます。
1 2 3 4 5 6 7 8 |
> $a | Where-Object { $_.name -match "yamada" } | Where-Object { $_.Age = "38" } > $a Name Age Country ---- --- ------- json 23 America yamada 38 Japan adam 19 France |
↑は先にかこっておいてもよい(以下)。
1 2 3 4 5 6 7 8 |
> $($a | Where-Object { $_.name -match "yamada" }) | Where-Object { $_.Age = "34" } > $a Name Age Country ---- --- ------- json 23 America yamada 34 Japan adam 19 France |
↑がOKなら以下もOK。
1 2 3 4 5 6 7 8 |
> $($a | Where-Object { $_.name -match "yamada" }).age="36" > $a Name Age Country ---- --- ------- json 23 America yamada 36 Japan adam 19 France |
この時、元のファイルを見てみると、以下のように変更されていない。$a に格納したデータを変更しているので、元のファイルが編集されているわけではない。
1 2 3 4 5 6 7 |
> ipcsv .\test.csv Name Age Country ---- --- ------- json 23 America yamada 31 Japan adam 19 France |
元のファイルを変更するためには(別のファイルに出力するでもよいが)、変更後のデータが格納されている $a を csv としてエクスポートする。Export-Csv のエイリアスは epcsv 。
1 2 3 4 5 6 7 8 |
> $a | Export-Csv .\test1.csv > ipcsv .\test1.csv Name Age Country ---- --- ------- json 23 America yamada 36 Japan adam 19 France |
例えば、複数まとめて編集も可能。以下では、別ファイルに出力しているが、同ファイルに上書きでもOK。
1 2 3 4 5 6 7 8 9 10 11 |
> $a | Where-Object { $_.name -match "yamada" } | Where-Object { $_.Age = "38" } > $a | Where-Object { $_.name -match "json" } | Where-Object { $_.Country = "Canada" } > $a | Where-Object { $_.name -match "adam" } | Where-Object { $_.Age = "109" } > $a | epcsv .\test2.csv > ipcsv .\test2.csv Name Age Country ---- --- ------- json 23 Canada yamada 38 Japan adam 109 France |
以上です。
↓↓↓ 持っていると便利な一冊。