CSVをエクセルで扱う人は多いだろう
でも僕はCSVはテキストエディタで編集をしている。
勝手に頭のゼロをなくしたり、元のファイルの内容を壊してしまうからね。
そういうことからCSVはなるべくテキストエディタでやっている人のほうが多いかもしれない。
でも、列の入れ替えはエクセルを使ってやっているのではないか?
固定長であったら簡単にできるけれど、長さが全然違えばテキストエディタでやるのは難しい。
そんな悩みを持っている方にエクセルを使わないで列を入れ替えする方法を紹介する。
正規表現で入れ替える
このようなCSVがあったとして、これを一列目と二列目を入れ替えよう。
果物,りんご 果物,みかん 果物,ぶどう 酒,ウオツカ 酒,スコッチ 調味料,塩
vimで置換のコマンドを実行するとすれば以下のようなものになる。
:%s/^\([^,]*\),\([^,]*\)/\2,\1/gc
vimだとコマンドの書式が邪魔をして、正規表現のエッセンスがわかりにくいので分離する。
:%s/検索文字/置換後/gc
これがvimの置換の書式
検索文字は
^\([^,]*\),\([^,]*\)
では内容を説明していく。
最初の^は行頭という意味。
\( \)で囲むとグループという意味になる。ここでは2つのグループを作っている。
[^,]はカンマ以外の文字という意味
*は直前に指定した文字を0回以上繰り返すという意味。
[^,]*でカンマ以外の文字列という意味になる。
検索条件をまとめると、
行頭 カンマ以外の文字列(グループ1) カンマ カンマ以外の文字列(グループ2) に合致する文字列
という意味になる。
つまり
(行頭)酒,ウオツカ
という文字列が選択される。
次に置換後の内容を説明する。
置換後の文字列は\2,\1
\1や\2は検索条件の中に\(\)で囲ったグループを表している。
最初に現れたのは\1 次は\2
何個もグループを作ったら\3 \4 というように増えていく。
\2、\1 というのは
2番目のグループ カンマ 1番目のグループ に置換すると言う意味になる。
つまり
酒(グループ1) ウオツカ(グループ2)になるので、ウオツカ,酒と並び替えられるわけ。
サクラエディタの場合
vimだとやたら\が現れるけれども、
サクラエディタはグループ化も単純に()で囲えばいいだけで、他は同じ。
\がないぶんスッキリ見えると思う
検索 ^([^,]*),([^,]*)
置換 \2,\1
※自宅に現在自由にできるwindows環境が乏しいため、未検証
結果
りんご,果物 みかん,果物 ぶどう,果物 ウオツカ,酒 スコッチ,酒 塩,調味料
予定通り一列と二列が入れ替わった。