フィルタで絞り込み

chrisbra/csv.vimには「フィルタ」と呼ばれる機能が用意されている。これはセルの値でデータの表示や非表示を切り替える機能だ。例えば、「1列目の値がAのものだけを表示したい」とか「1列目の値がAのものだけは非表示にしたい」といった操作を行うことができる。

chrisbra/csv.vimのフィルタは重ねていくことが可能で、例えば1列目の値がAのもので絞り込みを行い、さらにそこから3列目の値がCのものに絞り込んでいく、といったことができるようになっている。インタラクティブにデータを調べていくことができるし、例外的なデータだけを持っているレコードを調べたい場合などにもこの機能は便利だ。

chrisbra/csv.vimでは絞り込みのキーとなるセルにカーソルを置いた状態で、次のキーで絞り込みを実施していくことができる。

フィルタキー 内容
↩️ 現在の列と一致しない全ての行を動的に折り畳む
Space 現在の列と一致する全ての行を動的に折り畳む
BS 動的フィルタから最後のアイテムを削除

重ね合わせたフィルタは「BackSpace」キーで削除していくことができる。「Enter」キーと「スペース」キーがフィルタの重ね合わせ、「BackSpace」キーが最も新しいフィルタから削除していくキーだ。

「Enter」キーでセルの値以外の値を持つレコードが非表示となり、「スペース」キーでセルの値を持つレコードが非表示となる。chrisbra/csv.vimを使い出した最初のころは「Enter」キーや「スペース」キーでフィルタが発動するため、誤って押したときにいきなりデータが非表示になって面食らったことがあるのではないだろうか。慣れるとこれは便利な機能なので、ぜひ使ってみていただきたい。

「Enter」キーで絞り込み

例えば次のスクリーンショットでは、カーソルを3列目で「千代田区」の値に置いてある。この状態で「Enter」キーを押す。

「Enter」キーを押す

これで次のように3列目が「千代田区」以外のレコード(行)が全て非表示になる。

3列目が「非表示」以外の行が非表示になる

さらにフィルタを重ねていこう。今度は4列目の値が「パシフィックセンチュリーブ」にカーソルを置き、この状態で「Enter」キーを押す。

「Enter」キーを押す

「パシフィックセンチュリーブ」で絞り込みが行われ、さらに表示が限定されたことを確認できる。

さらに絞り込みが行われた状態

今度は逆にフィルタを解除していく。「BackSpace」キーを押す。

BackSpaceキーを押す

次のように「パシフィックセンチュリーブ」のフィルタが解除され、非表示から表示に戻ったことがわかる。

最も新しいフィルタが解除されている

さらに「BackSpace」キーを押す。

「BackSpace」キーを押す

次のように「千代田区」フィルタが解除され、ほかの行も表示されることを確認できる。

最初のフィルタも解除され、全て表示されている

このように、「Enter」キーと「BackSpace」キーでフィルタの追加と解除を行っていく、というのが基本的な使い方だ。

「スペース」キーで絞り込み

「スペース」キーでは選択した値を含むレコード(列)が非表示になる。「Enter」キーと「スペース」キーで非表示になる対象が逆というわけだ。例えば次のスクリーンショットでは「千代田区」でスペースキーを押している。

「千代田区」で「スペース」キーを押す

今度は「千代田区」を持つレコード(行)が非表示になったことを確認できる。

選択したデータを持つレコードが非表示になっている

「中央区」を選んで「スペース」キーを押せば、さらにそのデータを含むレコードが非表示になる。

「中央区」で「スペース」キーを押す

選択したデータを持つレコードが非表示になっている

「Enter」キーと「スペース」キーでそれぞれ非表示になる対象が異なるので、必要に応じて使い分ける。と言っても、どちらのキーでどちらが非表示になるかを覚えておく必要はなく、その場で実行して期待していないほうが非表示になったら「BackSpace」キーでフィルタを解除してもう一方のキーを押せばよい。

データ探しにとっても便利なフィルタ機能

フィルタはMicrosoft Excelのような主要なスプレッドシートアプリケーションは当然のように提供している機能だ。使っていないユーザーも多いかもしれないが、とても便利なのでぜひ一度試してみていただきたい。

chrisbra/csv.vimの提供する機能はスプレッドシートアプリケーションのように包括的なものではないが、これまで取り上げてきたように必要最低限の機能は提供している。これらの機能を使いこなせば、かなりの作業ができることはわかっていただけたのではないだろうか。CSVデータを扱うことが多いのであれば、ぜひ使ってみてほしい。

本連載で使っている~/.vimrcファイル

本連載で使っている設定ファイル(~/.vimrc)は以下の通りだ。

"dein Scripts=============================
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('~/.cache/dein/.')
  call dein#begin('~/.cache/dein/.')

  " Let dein manage dein
  " Required:
  call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('preservim/nerdtree')
  call dein#add('tpope/vim-commentary')
  call dein#add('tpope/vim-fugitive')
  call dein#add('fholgado/minibufexpl.vim')
  call dein#add('dense-analysis/ale')
  call dein#add('junegunn/fzf', {'build': './install --all'})
  call dein#add('junegunn/fzf.vim')
  call dein#add('sheerun/vim-polyglot')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

" seoul256
let g:seoul256_background = 233
colo seoul256

" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

" minibufexpl
nnoremap <silent> bn :<C-u>:bnext<CR>
nnoremap <silent> b1 :<C-u>:b1<CR>
nnoremap <silent> b2 :<C-u>:b2<CR>
nnoremap <silent> b3 :<C-u>:b3<CR>
nnoremap <silent> b4 :<C-u>:b4<CR>
nnoremap <silent> b5 :<C-u>:b5<CR>
nnoremap <silent> b6 :<C-u>:b6<CR>
nnoremap <silent> b7 :<C-u>:b7<CR>
nnoremap <silent> b8 :<C-u>:b8<CR>
nnoremap <silent> b9 :<C-u>:b9<CR>

" fzf
nnoremap <silent> fzf :Files<CR>
nnoremap <silent> ls :Buffers<CR>

"End dein Scripts=========================

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase

付録 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 列番号 指定した列内の最大値を出力
CSVMinCol 現在の列内の最小値を出力
CSVMinCol 列番号 指定した列内の最小値を出力
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を指定するとヘッダとしてのハイライトが行われなくなる