コンテンツにスキップ

コマンドライン

vastgrid-cli は、どんな大きさの CSV・TSV・Parquet・JSON Lines・Excel のファイルも、コマンド 1 つでブラウザーの表に開きます。ファイルはコマンドの中の DuckDB(Node.js)が読み、ページはそこから HTTP で行のブロックを読みます。どのサーバーから読むときとも同じ仕組みです。ファイルは手元のコンピューターから出ません。サーバーは 127.0.0.1 だけで、表示したアドレスを開いたブラウザーにだけ答えます。

ターミナルウィンドウ
npx vastgrid-cli sales.parquet
npx vastgrid-cli --save data/

インストールすると、コマンドの名前は vastgrid です。

ターミナルウィンドウ
npm install -g vastgrid-cli
vastgrid sales.parquet

Node.js 20 以降と、DuckDB の Node.js バインディングがある環境(Linux の x64・arm64 の glibc・musl、macOS の x64・arm64、Windows の x64・arm64)が必要です。

Usage: vastgrid [options] [<file or folder>…]
Options:
--save Let the page save edited cells into CSV and TSV files (⌘S or Ctrl+S).
--port <n> The port on 127.0.0.1; a free one by default.
--no-open Print the address without opening the browser.
-h, --help Show this help.
オプション 意味
--save 編集したセルを CSV・TSV のファイルに保存できるようにする(⌘S または Ctrl+S)
--port <n> 127.0.0.1 のポート。既定では空いているもの
--no-open ブラウザーを開かず、アドレスだけを表示する
-h、--help 使い方を表示する

コマンドはページのアドレスを表示し、ブラウザーで開きます。--no-open のときや、ブラウザーが開かなかったときは、表示されたアドレスを自分で開いてください。Ctrl+C でサーバーと DuckDB が止まり、一時ファイルのフォルダー(システムの一時フォルダーの vastgrid-cli)を消します。もう一度 Ctrl+C を押すと待たずに止まります。強制終了したコマンドが残したフォルダーは、次に起動したコマンドが消します。

形式 ファイル
CSV、TSV .csv、.tsv、.tab。圧縮したもの(.gz、.zst)も
JSON Lines、JSON .jsonl、.ndjson、.json。.gz も
Parquet .parquet、.pq
Excel .xlsx、.xlsm
  • 指定したファイルを開きます。フォルダーを指定すると、その中の表のファイルを 2 階層まで、隠しファイルと隠しフォルダーを除いて最大 1,000 個まで集めます。何も指定しなければ、いまのフォルダーを使います。
  • ページは、指定したファイル、続いてフォルダーのファイルを、いまのフォルダーからのパスで並べます。ほかのファイルは開きません。指定したフォルダーのより深い階層のファイルは、パスをアドレスに打てば開きますが、指定したファイルの隣のファイルは開きません。
  • DuckDB は、指定したファイルとフォルダーのフォルダーの外を読みません(リンクは辿った先で判断します)。

ページは最初のファイルを、ツールバー・ステータスバー・行ごとのチェックボックス付きで示します。表の上の一覧でほかのファイルを選び、ブックのシートはボタンで切り替えます。アドレスにファイルとシート(?file=…&sheet=…)が残るので、ブラウザーの戻る・進むで行き来でき、ページを読み込み直しても同じファイルを示します。それぞれの表示(並べ替え・絞り込み・列の幅・選択・スクロール)はタブが覚えていて(sessionStorage)、戻ったときと読み込み直したときに元どおり示します。表示の言語はブラウザーの言語(英語・日本語・中国語・韓国語・スペイン語・ポルトガル語・フランス語・ドイツ語)に従います。

グリッドがエンジンとできることはすべて使えます。並べ替え・絞り込み・検索・グループ化・ピボット・数式・統計・セルの編集です。書き込んだセルは、ページを読み込み直してもコマンドが止まるまで DuckDB が持っています。書き出したファイルはブラウザーがダウンロードします。

--save を付けると、⌘S か Ctrl+S(またはツールバーの保存)で、書き込んだセルを元の CSV・TSV のファイルに保存します。編集したフィールド以外のバイトはそのまま残ります。付けなければ、コマンドがファイルを変えることはありません。Parquet・JSON Lines・Excel のファイルは保存しないので、書き出してください。ディスク上で変わったファイルは読み直します。書き込んだセルがあるときは、変わったことを知らせ、破棄するまでセルを残します。

コマンドが表示するアドレスには、ランダムなトークンが入っています。トークン付きの最初の要求は、サーバーのポートに HttpOnly・SameSite=Strict の Cookie を受け取り、トークンのないアドレスへ移ります。以降の要求には Cookie が必要で、なければ 401 を返します。このため、

  • ブラウザーで開いているほかのサイトは、サーバーを通じてファイルを読むことも変えることもできません(その要求には Cookie が付きません)。
  • 同じコンピューターのほかの利用者も 127.0.0.1 には届きますが、トークンを知りません。
  • 127.0.0.1 を指すほかのサイトの名前(DNS リバインディング)は、Host ヘッダーで断ります。Host はサーバーのポート付きの 127.0.0.1 か localhost でなければなりません。

ページの Content Security Policy は、自分のサーバーにだけ接続し(connect-src 'self')、ほかに何も読み込まず、フレームに入らないようにしています。環境変数 VASTGRID_TOKEN でトークン(16 文字以上の英数字・-・_)を決めると、アドレスが変わりません。ほかの利用者がプロセスの引数から見られないよう、オプションではなく環境変数にしています。

サーバーは 127.0.0.1 でしか待ち受けません。遠くのマシンのファイルを開くときは、同じ番号のポートを転送します。

ターミナルウィンドウ
ssh -L 5185:127.0.0.1:5185 server
# サーバーで:
npx vastgrid-cli --port 5185 --no-open /data

表示されたアドレスを、手元のコンピューターで開いてください。

  • ページを閉じる前に警告しません。書き込んだセルはコマンドが止まるまで残り、保存しなければそこで失われます。

詳しくは GitHub の cli.md(英語)にあり、試験の方法も書いています。