ovを使用して大きなファイルやCSVファイルをシュッと見る
はじめに
ovはターミナルページャーです。
UTF-8のみをサポートしています。
ov
ではページャーとして大きなファイルを開くのにも適しているため紹介します。
ov
の初期バージョンでは、ファイルをすべてメモリに読み込む使用でしたが、v0.30.0からは、seek
を利用し必要な分だけ読み込めるようになりました。
そのため、大きなファイルやCSVファイルをシュッと見ることができるようになりました。
単に開くのが早いだけでなく、開いた後もなるべく快適に操作できるようになっています。
less
との比較
less
は大きなファイルであっても、素早く開くことができますが、開いた後必要になったときにはファイルの全体を読み込むため、操作ができない時間があります。
ov
は、同じように開いた後、スレッド(goroutine)でファイルを読み込むため、操作を妨げません。
以下は4.6GBのファイルをless
とov
で開いたときの動作の比較です。
行番号付きで開いています。
less
では行番号の計算のため時間が掛かっていますが、ov
では最後尾に移動し、また先頭に戻って移動しています。
ov
では開いた時点でgoroutineでファイルを読み取り続けていますが、実際にファイルの内容をすべてメモリに入れているわけではなく、行数とseek
するためのファイルの位置を記録して読み捨てています。
これは1万行単位のブロックで記録しています。必要になったらブロック単位で読み込みをおこなうので、メモリの使用量も少なく、高速に移動できます。
制限事項
ov
の上記の動作はseek
できるファイルであることが条件です。パイプによる入力や、seek
できない特殊ファイルは、なるべくメモリに読み込んで動作します
(メモリを制限することも可能で、メモリよりも大きな内容は途中で読み込みを停止したり、先に進むと戻れない部分が出るようになっています)。
また、ov
では圧縮ファイルも意識せずに開くことができますが、圧縮ファイルはseek
と伸長されたバイト数が一致しないため、パイプ入力と同様の動作になります。
CSVファイルの表示
ov
は、もともとpsql
の表示に便利なように機能を追加した経緯があり、CSV
ファイルの表示も便利になっています。
ヘッダーの固定表示
ov
ではヘッダーを固定表示することができます。
--header
オプションを指定すると、ヘッダーを固定表示します。
CSV
ファイルで最初の1行がヘッダーだった場合は、以下のようにします。
$ ov --header 1 file.csv
最新のless
でもヘッダーを固定表示することができますが、ov
ではヘッダーの折返しにも対応しているところに違いがあります。
列モード
ov
では--column-delimiter
で区切り文字(","がデフォルトのため、CSVでは省略可)を指定して--column-mode
オプションを指定すると、列モードで表示します。
$ ov --column-delimiter "," --column-mode file.csv
列モードになると、列のハイライト表示が可能になり、縦位置が揃っていないCSVファイルでも、列の位置が分かりやすくなります。
さらに--column-rainbow
を指定すると、列ごとに色を変えて表示します。
これらのオプションを組み合わせると以下のようになります。
$ ov --column-delimiter "," --column-mode --column-rainbow file.csv
制限事項としては、CSV
ファイルとしてパースしているのではないため、区切り文字(",")が含まれる列や改行が含まれる列は正しく表示できません。
逆にCSV
としてパースしていないため、大きなCSVファイルでも高速に表示でき、移動も高速にできます。
Discussion