CSVをPowerShellで並び替え

未分類

CSVファイルを何度も同じようにソートする作業があったとしたら
毎回毎回Excelで開いて、並び替えして再度CSVとして保存して…

ちょっと効率的とは言えないですよね

そこで使えるのが今回のtipsです。

パワーシェルでソートする方法

まずはコマンドを見てみましょう

Import-Csv sample.csv | Sort @{Expression="col1";asc=$true} | Export-Csv out.csv

取り込むCSVを指定
ソート順を指定 昇順の場合はasc=$true/降順の場合はasc=$false
出力ファイルを指定

という形になります。

実際に並び替えてみる

sample.csvを用意します。以下のようなデータが入っているとして

id,name,age
1,Anne,23
2,John,22
3,Damian,24
4,Chris,30
5,Edward,18

現時点では id の昇順となっているので、これを年齢の昇順に変更してみましょう。

Import-Csv sample.csv | Sort @{Expression="age";asc=$true} | Export-Csv out.csv

out.csvの中身がageの昇順となっていることが分かりますね。

降順もやってみましょう。

Import-Csv sample.csv | Sort @{Expression="age";asc=$false} | Export-Csv out.csv

このように、ascの指定をtrue/falseで切り替えることで昇順降順が指定できます。

複数列で並び替える

先程の例ではシンプルに単一列での並び替えを行いました。
では、複数列でソートするにはどのようにしていするのか、やってみましょう。
並び替えの指定を行うのはパイプで挟まれた中央部分の記述ですね。
これをカンマ区切りで指定することができます。

サンプルデータを以下のように変更してみます。

id,name,age,address
1,Anne,23,NewYork
2,John,22,Toronto
3,Damian,24,NewYork
4,Chris,30,Boston
5,Edward,18,Boston

address列を追加してみました。住んでいる地域と年齢でソートしてみましょう。

Import-Csv sample.csv | Sort @{Expression="address";asc=$true},@{Expression="age";asc=$true} | Export-Csv out.csv

このように、複数のカラムでソートすることができました。

もっと便利にスクリプト化

毎回同じようにソートするのであれば、
今まで紹介してきたコマンドを毎回指定するのも若干面倒になってきます。

コマンドをどこかにメモしておいてコピペするという手もありますが、
どうせならスクリプトファイルを作成してポチっと実行できるようにしておきましょう。

param (
    [Parameter(Mandatory=$True)] # 必須パラメータ
    [string]$in,
    [Parameter(Mandatory=$True)] # 必須パラメータ
    [string]$out
)

Import-Csv $in | Sort @{Expression="address";asc=$true},@{Expression="age";asc=$true} | Export-Csv $out

コチラのスクリプトを実行すると、in/outの入力を求められるのでファイル名を指定してあげます。
ちなみに、初めてスクリプトを実行する時はエラーが出力されるので下記コマンドでポリシーを変更してあげましょう。(参考:https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750)

Set-ExecutionPolicy RemoteSigned

もしファイル名が固定できるのであれば、スクリプトの中に記載してしまうのもOKです。

param (
    [string]$in = "sample.csv",
    [string]$out = "auto-sorted2.csv"
)

Import-Csv $in | Sort @{Expression="address";asc=$true},@{Expression="age";asc=$true} | Export-Csv $out

如何だったでしょうか。
このようにスクリプトファイルを作れれば、
フォルダにあるCSV全てを並び替える処理も作れそうですね!

ではまた!