Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

VimでCSVファイルの3列目をキーにしてソートする

$
0
0

Vimには:sortコマンドが用意されています。これを使えば、バッファ内の行を柔軟にソートすることができます。

:sortの基本

以下のようなファイルに対して、:%sortとすればファイル全体が辞書順でソートされます。

names.txt
charlie
alice
bob
dave
eve

以下のように数値であれば、nオプションをつけて:%sort nとすれば数値順でソートされます。

number.txt
100
10
1

CSVを3列目でソートする

以下のようなファイルを開いているとします。:%sort /,\zs[^,]*\ze$/ nrを入力します。

sample.csv
alice,5,10000
bob,4,1000
charlie,1,1
dave,8,100
eve,2,10

すると、3列目でソートしたファイルが得られます。

sample.csv
charlie,1,1
eve,2,10
dave,8,100
bob,4,1000
alice,5,10000

もっと汎用的に考えてみます。以下のファイルがあったときに、任意のカラムでソートしたいとします。ソートのキーとなるカラムは数値で指定するとしましょう。

sample2.csv
alice,5,10000,d
bob,4,1000,e
charlie,1,1,a
dave,8,100,b
eve,2,10,c

3列目をキーとしたければ、 :%sort /\([^,]*,\)\{2\}\zs[^,]*/ rとします。2を書き換えれば任意のカラムでソート可能です。4列目をキーとしたければ、3とします。

応用

CSVはシェル・コマンドのsortで簡単にソートできますが、Vimのソートはより柔軟です。

以下のようなPHPファイルがあると仮定します。

before.php
<?php$users=[['name'=>'P=NP','department'=>'Production'],['name'=>'alice','department'=>'Planning'],['name'=>'=bob=','department'=>'Customer Support'],['name'=>'eve','department'=>'Planning'],['name'=>'dave','department'=>'Sales'],['name'=>'jack','department'=>'Human Resources'],['name'=>'kay','department'=>'Human Resources'],];

ここに対して、 ソート箇所をVisualモードで選択し、 :'<,'>sort /department' => '\zs[^']*\ze'/ rを打つと部署をキーとしてソートした結果が得られます。

after.php
<?php$users=[['name'=>'=bob=','department'=>'Customer Support'],['name'=>'jack','department'=>'Human Resources'],['name'=>'kay','department'=>'Human Resources'],['name'=>'alice','department'=>'Planning'],['name'=>'eve','department'=>'Planning'],['name'=>'P=NP','department'=>'Production'],['name'=>'dave','department'=>'Sales'],];

tips

正規表現を書きたくない人で、シェルコマンドが分かる人なら、:%!sort -t',' -k=3としてもソートできます。

詳しくは

:help :sort


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>