Skip to content

v1.12.4 — 絞り込んだ行に、桁を合わせる

Choose a tag to compare

@MR-TABATA MR-TABATA released this 21 Aug 12:56
· 34 commits to main since this release
f22f755

桁を揃えたまま grep できる——それが 1.11 からの看板でした。ところが絞り込んだ結果の、肝心の値が読めていませんでした

絞り込んだら、絞り込んだ行に桁が合う

列幅は、ファイルの先頭 1000 行と末尾 1000 行から決めていました。だから、長い値が中間にしか無いファイルでは拾えません。

45MB・300 万行の CSV を CSV 表示にして ERROR で 59 行に絞ると、こうなっていました。

id      │ level │ note
50000   │ ERROR │ con…
100000  │ ERROR │ con…

note の中身は connection reset by peer - retrying で 34 桁。列幅は見出しの note と、先頭・末尾に並ぶ ok だけで決まって 4 桁でした。上限の 40 桁に当たっていたわけではありません。絞り込んだ後こそ読みたい列が、絞り込んだせいで読めない状態です。

いまは、フィルタが効いている間は一致行から列幅を決め直します。上の表示はこうなります。

id      │ level │ note
50000   │ ERROR │ connection reset by peer - retrying
100000  │ ERROR │ connection reset by peer - retrying
  • 一致が 400 行以下(ふつうの絞り込み)は全部見て決めます。近似ですらありません。
  • 一致が多いときは両端 200 行ずつで止めます。一致行はファイル全体に散らばるので 1 行ずつ引くことになり、10GB で 2000 行なら 0.419 秒、400 行なら 0.084 秒。絞り込みが確定した瞬間に払う代金なので、上限を掛けました。
  • 打っている途中で一瞬 0 件になっても、列名の帯は空にしません。
  • 絞り込んでから構造化表示に入ったとき、一致行の 1 本目が列名になっていたのも直しました(列名は必ず先頭行から取ります)。

フィルタを解けば、元どおりファイル全体の桁に戻ります。

小さいファイルで、画面が食い違っていた

8MB 未満のファイルで、フィルタ ON のまま構造化表示へ切り替えると、画面の 3 箇所が別のことを言っていました。

見るところ 出ていたもの
本文 絞り込みの生テキスト(整形もされない)
列名の帯 一致行の 1 本目
ステータス 絞り込みの行数

順番の問題でした。整形を組んだ直後に検索バーを閉じる処理が走り、退避してあった元の全文で本文を上書きしていました。整形結果だけが消えて、帯と行数が残る。整形の前にフィルタを畳むようにしました。

小さいファイルでは、絞り込みは維持されません。 本文そのものを整形後のテキストへ差し替える作りなので、両立できません(「桁を揃えたまま grep」は 8MB 以上のファイルの機能です)。

確認したこと

配布するものと同じ .app で、両方の順番を通しています。

条件 結果
45MB・300 万行 CSV、構造化 → 絞り込み 34 桁の値が全部出る
同、絞り込み → 構造化 同じ。列名も id / level / note
絞り込みを解除 元の桁に戻る
10GB・8642 万行、5134 万件ヒット 詰まらない(漏斗を押して 0.30 秒で戻る)
4.2MB CSV、絞り込み → 構造化 本文・帯・行数が一致

616 のテストが緑。Apple Developer ID で署名し、公証を通しています——ダブルクリックで開きます(Apple Silicon / Intel 両対応・macOS 13+)。