前回は、さまざまなプラグインをまとめたメタパッケージである「vim-polyglot」を紹介した。同パッケージには、各種プログラミング言語やファイル形式のシンタックスハイライト、特化機能を提供するプラグインがまとめられており、とりあえず入れておけば使い勝手が良くなるプラグインパッケージだ。それほど害があるプラグインではないので、入れておいて損はないと思う。

本稿執筆時点で、vim-polyglotがインストールするプラグインの数は152個ある。プログラミング言語関係のプラグインが多いが、ファイル形式関係のプラグインもいくつか含まれている。前回はこのプラグインの効果を示すサンプルとして、CSV(Comma Separated Values:カンマ切りデータ)を編集する際の表示が変わることを紹介した。

CSVの表示が変わったのは、実際にはvim-polyglot経由でインストールされた「chrisbra/csv.vim」というプラグインの効果によるものだ。前回は、vim-polyglotの導入効果の一例として紹介したが、実はこのプラグインはほかにも多くの便利な機能を備えている。そこで、今回からは数回に分けて、chrisbra/csv.vimの活用方法を紹介しよう。

CSVファイル

CSVは、テキストデータ形式の一つであり、セルとセルの間を「,(カンマ)」で区切るかたちで構成されている。スプレッドシートのデータなどを想像するとわかりやすいだろう。

例えば、次のデータは「読み仮名データの促音・拗音を小書きで表記するもの - zip圧縮形式 日本郵便」からダウンロードしてきた郵便番号と住所のCSVデータだ。データはカンマで区切られており、文字列に相当するデータは「”“(ダブルクォーテーション)」で囲まれている。

13101,"100  ","1000000","トウキョウト","チヨダク","イカニケイサイガナイバアイ","東京都","千代田区","以下に掲載がない場合",0,0,0,0,0,0
13101,"102  ","1020072","トウキョウト","チヨダク","イイダバシ","東京都","千代田区","飯田橋",0,0,1,0,0,0
13101,"102  ","1020082","トウキョウト","チヨダク","イチバンチョウ","東京都","千代田区","一番町",0,0,0,0,0,0
13101,"101  ","1010032","トウキョウト","チヨダク","イワモトチョウ","東京都","千代田区","岩本町",0,0,1,0,0,0
13101,"101  ","1010047","トウキョウト","チヨダク","ウチカンダ","東京都","千代田区","内神田",0,0,1,0,0,0
13101,"100  ","1000011","トウキョウト","チヨダク","ウチサイワイチョウ","東京都","千代田区","内幸町",0,0,1,0,0,0
13101,"100  ","1000004","トウキョウト","チヨダク","オオテマチ(ツギノビルヲノゾク)","東京都","千代田区","大手町(次のビルを除く)",0,0,1,0,0,0
13101,"100  ","1006890","トウキョウト","チヨダク","オオテマチジェイエイビル(チカイ・カイソウフメイ)","東京都","千代田区","大手町JAビル(地階・階層不明)",0,0,0,0,0,0
13101,"100  ","1006801","トウキョウト","チヨダク","オオテマチジェイエイビル(1カイ)","東京都","千代田区","大手町JAビル(1階)",0,0,0,0,0,0
13101,"100  ","1006802","トウキョウト","チヨダク","オオテマチジェイエイビル(2カイ)","東京都","千代田区","大手町JAビル(2階)",0,0,0,0,0,0
13101,"100  ","1006803","トウキョウト","チヨダク","オオテマチジェイエイビル(3カイ)","東京都","千代田区","大手町JAビル(3階)",0,0,0,0,0,0
13101,"100  ","1006804","トウキョウト","チヨダク","オオテマチジェイエイビル(4カイ)","東京都","千代田区","大手町JAビル(4階)",0,0,0,0,0,0
13101,"100  ","1006805","トウキョウト","チヨダク","オオテマチジェイエイビル(5カイ)","東京都","千代田区","大手町JAビル(5階)",0,0,0,0,0,0
13101,"100  ","1006806","トウキョウト","チヨダク","オオテマチジェイエイビル(6カイ)","東京都","千代田区","大手町JAビル(6階)",0,0,0,0,0,0
13101,"100  ","1006807","トウキョウト","チヨダク","オオテマチジェイエイビル(7カイ)","東京都","千代田区","大手町JAビル(7階)",0,0,0,0,0,0
13101,"100  ","1006808","トウキョウト","チヨダク","オオテマチジェイエイビル(8カイ)","東京都","千代田区","大手町JAビル(8階)",0,0,0,0,0,0
13101,"100  ","1006809","トウキョウト","チヨダク","オオテマチジェイエイビル(9カイ)","東京都","千代田区","大手町JAビル(9階)",0,0,0,0,0,0
13101,"100  ","1006810","トウキョウト","チヨダク","オオテマチジェイエイビル(10カイ)","東京都","千代田区","大手町JAビル(10階)",0,0,0,0,0,0
13101,"100  ","1006811","トウキョウト","チヨダク","オオテマチジェイエイビル(11カイ)","東京都","千代田区","大手町JAビル(11階)",0,0,0,0,0,0
13101,"100  ","1006812","トウキョウト","チヨダク","オオテマチジェイエイビル(12カイ)","東京都","千代田区","大手町JAビル(12階)",0,0,0,0,0,0
13101,"100  ","1006813","トウキョウト","チヨダク","オオテマチジェイエイビル(13カイ)","東京都","千代田区","大手町JAビル(13階)",0,0,0,0,0,0
13101,"100  ","1006814","トウキョウト","チヨダク","オオテマチジェイエイビル(14カイ)","東京都","千代田区","大手町JAビル(14階)",0,0,0,0,0,0
13101,"100  ","1006815","トウキョウト","チヨダク","オオテマチジェイエイビル(15カイ)","東京都","千代田区","大手町JAビル(15階)",0,0,0,0,0,0
13101,"100  ","1006816","トウキョウト","チヨダク","オオテマチジェイエイビル(16カイ)","東京都","千代田区","大手町JAビル(16階)",0,0,0,0,0,0
13101,"100  ","1006817","トウキョウト","チヨダク","オオテマチジェイエイビル(17カイ)","東京都","千代田区","大手町JAビル(17階)",0,0,0,0,0,0

CSVはシンプルなルールのテキスト形式データだ。一応標準と言える規約も存在している。実際にはアプリケーションごとにCSVデータの解釈が多少異なる部分もあるのだが、問題なく使えることが多い。

CSVはカンマ区切りのファイルだと説明したが、区切りはカンマではないこともある。「;(セミコロン)」区切りだったり、スペース区切りやタブ区切りだったりすることもある。スペース区切りのデータは「SSV (Space Separated Values)」、タブ区切りのデータは「TSV (Tab Separated Values)」といった名称で呼ばれることもあり、拡張子として「csv」ではなく「ssv」や「tsv」が使われることもある。

ただし、多くのケースでカンマ以外の区切りデータであっても、まとめてCSVとして扱われることが多いようだ。そのため、アプリケーションの多くは区切り文字を指定できるようになっており、カンマ以外のデータの読み込み/保存ができるようになっていることが多い。

CSVは使われているシーンが多い

CSVは、データ交換用のフォーマットとしてよく使われる。スプレッドシートアプリケーションのデファクトスタンダードであるMicrosoft Excelのファイルがそのまま使われることも多いのだが、Excelのデータは当然ながら対応したアプリケーションでなければ編集することができない。対応アプリケーションであっても、バージョンが古いと問題が出ることもある。

だが、CSVであれば大抵のスプレッドシートアプリケーションで扱うことができるし、エディタで開いて編集することも可能だ。データベースにおいても、データベースのデータをそのまま交換用データとして使うのには無理があるため、SQL形式のデータにするか、またはCSVのようなデータ形式でエクスポートされた上で交換に使われることが多い。とにかくシンプルなデータ形式であるCSVは、多くのソフトウエアで扱えることが利点なのだ。

産業用デバイスなどにおいても同様だ。POSシステムから上がってくる売上データや、産業用機械から出力される計測データなどもCSV形式でやり取りされることが多い。例えば、Linuxサーバに売上データや計測データがCSVデータとして送られてくるケースを考える(こういった使い方は結構多い)。送られてきたデータは、何らかの加工をして使うことになる。業務システムが構築されている場合は、自動的に業務システムが読み込むことになるだろう。

最も簡単な加工方法は、CSVファイルを一旦Windows PCにコピーし、Microsoft ExcelまたはOffice 365で編集するというものだ。小規模の事業所や部門では、こうしたかたちでデータを加工していることが少なくない。

CSVデータはエディタで編集できるものの、その編集作業はやりやすいものとは言えない。しかし、Microsoft Excelで行う簡単な編集作業くらいであれば、実はVimでもできる。先ほど紹介した「chrisbra/csv.vim」にはCSVファイルを操作するための数々の機能が用意されている。見た目を整えるだけではなく、スプレッドシートアプリケーションのように操作することが可能だ。こちらで事が済むのであれば、わざわざダウンロードしてMicrosoft Excelで開いて編集する必要はない。Windows TerminalからLinuxサーバにログインして、そこでちょっとVimを使えば作業完了、とできる。

むしろ、CSVに関して、Microsoft ExcelよりもVimのほうが役立つケースもある。データの差分を比較するケースでは、Vimのほうが便利だ。計測データなどは、前日とのデータ比較などを行う必要があることも多いが、Vimを使うとこれが実に簡単に実施できる。適材適所ではあるのだが、こうしたことからもVimのスキルを引き上げておいて損がないことはおわかりいただけるだろう。

chrisbra/csv.vimのシンプルな使用サンプル

詳しくは次回以降で説明するとして、今回はchrisbra/csv.vimの利用例のいくつかを簡単に取り上げておく。まず、次のスクリーンショットは先ほどのCSVファイルをchrisbra/csv.vimがインストールされたVimで開いたものだ。シンタックスハイライトされているほか、カンマ部分が縦線で表示され、さらに折返し表示が無効になっている。これだけでもCSVファイルを閲覧/編集するに際して、扱いやすいはずだ。

Vim + chrisbra/csv.vimでCSVファイルを開いたところ

次のスクリーンショットは、テーブルのように前後左右の表示形式をそろえ、さらにカーソルのある列をハイライト表示させたものだ。こちらのほうが、さらに人間が読みやすいだろう。

CSVをテーブル形式で表示させたところ

編集画面は最初のスクリーンショットのままで、テーブル表示はプレビューとして表示させるだけといった使い方もできる。次のような具合だ。

CSVデータをテーブル形式でプレビュー表示させたもの

chrisbra/csv.vimはCSVデータをさまざまな形式で見せることができるのだが、最も強力な機能の一つが「フィルタ」だ。この機能を使用すると、「特定の列の値がある値であるものだけを表示する」とか、「ある値ではないものだけを表示する」といったことができる。フィルタは重ねることが可能で、複数のフィルタを重ねて表示内容を絞り込んでいくことができる。

フィルタによるデータの絞り込み

フィルタによるデータの絞り込みはMicrosoft Excelでもできる機能だが、Vimでこれができると、人間がインタラクティブにCSVデータの解析をできるようになる。ぜひとも使い方を習得してもらいたい機能の一つだ。

chrisbra/csv.vimが提供する代表的な機能

chrisbra/csv.vimが提供する代表的な機能を次にまとめておく。一気に全てを覚えることはできないので、次回以降、トピックを分けながら操作方法を取り上げていこうと思う。最後にはカスタマイズする方法を紹介し、特に自分がよく使う機能をもっと便利に利用できる方法を紹介しよう。

コマンド 内容
CSVWhatColumn カーソルが何列目にあるか
CSVWhatColumn! 同列1行目の内容を表示
CSVNrColumns 最大列数を表示(先頭から10行で判断)
CSVSearchInColumn /パターン/ 現在の列をパターンで検索
CSVSearchInColumn 列番号 /パターン/ 指定した列をパターンで検索
CSVHiColumn 現在の列を強調表示
CSVHiColumn 列番号 指定した列を強調表示
CSVHiColumn! 列の強調表示を解除
CSVArrangeColumn テーブル形式での表示へ切り替え(実験的機能)
CSVTabularize テーブル形式でのプレビュー表示
CSVDeleteColumn 現在の列を削除
CSVDeleteColumn 列番号 指定した列を削除
CSVHeader 1行目を別ウィンドウで表示
CSVHeader 行数 先頭から指定行数分を別ウィンドウで表示
CSVHeader! 開いた行ヘッダウィンドウを閉じる
CSVVHeader 1列目を別ウィンドウで表示
CSVVHeader 列番号 行頭から指定列数分を別ウィンドウで表示
CSVVHeader 開いた列ヘッダウィンドウを閉じる
CSVSort 現在の列でファイルをソート
CSVSort 列番号 現在の列でファイルをソート
CSVSort! 現在の列でファイルを逆順にソート
CSVSort! 列番号 現在の列でファイルを逆順にソート
CSVColumn 現在の列をコピー
列番号CSVColumn 指定した列をコピー
CSVMoveColumnor 現在の列を最後の列の右側へ移動
CSVMoveColumn 列番号 列番号 最初に指定した列を、2つ目に指定した列の右側へ移動
CSVSumCol 現在の列の合計を出力
CSVSumCol 列番号 指定した列の合計を出力
CSVSumRow 行の合計を出力
CSVNewRecord 新しい行を作成
CSVNewDelimiter デリミタ 区切り文字を変更
CSVConvertData データをほかの形式に変換
CSVDuplicates 列番号 指定した列で重複している行を出力
CSVAnalyze 現在の列を分析する(値とその数、割合など)
CSVAnalyze 列番号 指定した列を分析する(値とその数、割合など)
CSVVertFold 1列目から現在の列を折りたたむ
CSVVertFold 列番号 1列目から指定した列までを折りたたむ
CSVVertFold! 列の折りたたみを解除する
CSVTranspose 列と行を入れ替える(転置)
CSVAddColumn 現在の列の右側に新しい列を追加
CSVAddColumn 列番号 指定した列の右側に新しい列を追加
CSVDupColumn 現在の列を右側に複製
CSVDupColumn 列番号 指定した列を右側に複製
CSVSubstitute 列番号/パターン/文字列/ 指定した列で置換
CSVColumnWidth 列ごとの最大文字数を出力
CSVCountCol 現在の列内の値の数を出力
CSVCountCol 列番号 指定した列内の値の数を出力
CSVMaxCol 現在の列内の最大値を出力
CSVMaxCol 列番号 指定した列内の最大値を出力
CSVMaxMin 現在の列内の最小値を出力
CSVMaxMin 列番号 指定した列内の最小値を出力
CSVAvgCol 現在の列内のデータの平均値を出力
CSVAvgCol 列番号 指定した列内のデータの平均値を出力
PopVarCol 現在の列の母集団分散を出力
PopVarCol 列番号 指定した列の母集団分散を出力
SmplVarCol 現在の列の標本分散を出力
SmplVarCol 列番号 指定した列の標本分散を出力
PopStdCol 現在の列の母標準偏差を出力
PopStdCol 列番号 指定した列の母標準偏差を出力
SmplStdCol 現在の列の標本標準偏差を出力
SmplStdCol 列番号 指定した列の標本標準偏差を出力
キー 内容
「Ctrl」+「→」 次の列へ移動
L 次の列へ移動
W 次の列へ移動
「Ctrl」+「←」 前の列へ移動
E 前の列へ移動
H 前の列へ移動
列を上へ移動
K 列を上へ移動
列を下へ移動
J 列を下へ移動
キー 内容
↩️ 現在の列と一致しないすべての行を動的に折りたたむ
Space 現在の列と一致するすべての行を動的に折りたたむ
BS 動的フィルタから最後のアイテムを削除
設定項目 内容
g:csv_delim デフォルトのデリミタ
g:csv_no_conceal 1に設定するとデリミタ部分を|で視覚的に表示(デフォルトは設定されていない)
g:csv_highlight_column ‘y’に設定するとカーソルがある列を自動でハイライト
b:csv_headerline ヘッダの行数を指定。0を指定するとヘッダとしてのハイライトが行われなくなる

Vimプラグイン沼

本連載では、これまで人気の高いプラグインを紹介してきたが、それぞれのプラグインについては簡単に代表的な機能を解説するに留まっている。各プラグインを深堀りすれば、もっと便利な活用方法もあるだろう。

Vimは使い方を調べれば調べるほど、そして設定ファイルを整理すればするほど、作業の効率を引き上げることが可能となる。それがゆえに、Vimは”沼”なのだ。使い込むほど、Vimから離れられなくなっていく。しかし、それに応えてくれるエディタであることも間違いのないところだ。