📘

ovを使用して大きなファイルやCSVファイルをシュッと見る

2023/10/06に公開

はじめに

ovはターミナルページャーです。
UTF-8のみをサポートしています。

ovではページャーとして大きなファイルを開くのにも適しているため紹介します。

ovの初期バージョンでは、ファイルをすべてメモリに読み込む使用でしたが、v0.30.0からは、seekを利用し必要な分だけ読み込めるようになりました。
そのため、大きなファイルやCSVファイルをシュッと見ることができるようになりました。

単に開くのが早いだけでなく、開いた後もなるべく快適に操作できるようになっています。

lessとの比較

lessは大きなファイルであっても、素早く開くことができますが、開いた後必要になったときにはファイルの全体を読み込むため、操作ができない時間があります。

ovは、同じように開いた後、スレッド(goroutine)でファイルを読み込むため、操作を妨げません。

以下は4.6GBのファイルをlessovで開いたときの動作の比較です。
行番号付きで開いています。
lessでは行番号の計算のため時間が掛かっていますが、ovでは最後尾に移動し、また先頭に戻って移動しています。

large-file

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としてパースしていないため、大きなCSVファイルでも高速に表示でき、移動も高速にできます。

Discussion