標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

(解説) The unbreakabe CSV editor - "CSView" v1.2.0

今回

  • 本番の業務データの手直し
  • 俺の家計簿のインポート用データ作成

に耐えうる CSV エディターという謎コンセプトのもと、大幅改修を行った。

Unbreakable CSV

よくある CSV エディターでは

"A1","B1","C1"
"A2","B2","C2"
"A3","B3","C3"

B2XX と修正すると

A1,B1,C1
A2,XX,C2
A3,B3,C3

と、全ての二重引用符がはがれてしまったりする。

CSView v1.1.3 までは標準パッケージの "encoding/csv" 経由で読みこんでいたので、二重引用符の有無が読み込んだ時点で失われていた。

CSView v1.2.0 では、文字コード変換、CSVの元文字列の現状保持まで行う独自のサブパッケージ "github.com/hymkor/csview/unbreakable-csv"1 を新規に作成し、使用するようにした。その結果:

"A1","B1","C1"
"A2",XX,"C2"
"A3","B3","C3"

と修正箇所以外、原則的に変更が発生しないようにすることが可能になった。

この例では変更したXX の二重引用符が剥れてしまっているが、" キーで二重引用符で囲むことを明示的に指示することも可能だ。

なお、これは二重引用符だけではなく、BOM の有無、CRLF/LFの混在については同様の扱いとなる。つまり:

  • BOMのあるセルから勝手にBOMは削除しない
  • BOMのないセルに勝手にBOMは追加しない
  • LF行を勝手にCRLFにしない
  • CRLF行を勝手にLF行にしない

これらによって、例えば本番データに何らかの不備があって、手修正しなければいけない場合でも、本ツールが使える。修正後、diff コマンドで本当に自分が手を加えた箇所だけが変わっていることを確認できれば安心できるだろう。

修正有無の管理

  • 修正したセルは下線を引くようにした
  • 修正済みのセルの上で u を押下すると、最初の値を復元できるようにした。
    (そして、オリジナルの値に復元すると下線は消える)

ステータスラインの表示を改善した。

  • セルの値の元データを表示するようにした。
    二重引用符で囲まれているか否かを目視できる。
  • 区切り文字を表示
    ,␍␊ など表示するようにした。(フォントが分かりにくいが)

第二文字コードを指定可能に

今までは UTF8 でない場合の文字コードWindows の現在のコードページとなっていた。だが、Linux などにはコードページがないため、第二文字コードがない状態だった。

そこで csview -iana Shift_JIS FILENAME というように明示的に指定できるようにした。 文字コード名については以下を参照のこと。日本においては、ほぼ Shift_JISEUC-JP で済むが

幅があいまいな文字が含まれている場合、セルの幅が正しくなくなる不具合を修正

→ とか ∇ のこと。v1.1.3 を WindowsTerminal で利用すると、一桁しか使っていないのに二桁使用していると誤認して、表示がズレる問題があった。

これらの文字はUnicodeにおいて、2桁分を消費するか1桁分を消費するか、端末ごとに決まるとされている。nyagos や go-readline-ny では ターミナルの種類を調べて、どちらであるか判断していた。だが、CSView ではそのような個別対応はせず、起動時に∇を出力して、そのカーソル移動量を ESC[6n で得て調べるという汎用的なことをした。これは:

という記事に記載されている Reline (pure Ruby) の方法を真似た2

ヒストリーや補完対応

  • セル入力時: 現在のセルと同じ列の上で使われている値で補完(Ctrl-I)したり参照(Ctrl-P)できるようにした。
  • 保存時:ファイル名補完をサポート

go-readline-ny/completion の補完機能に少し手を入れて3 、補完候補が1個しないない時に空白を末尾に入れないようにした。

まとめ

今回の修正で、データに余計な変更が入らないという強みができた以上、 「Simple CSV viewer/editor」というDescription は、やや弱気すぎるように思われた。そこで「Unbreakable CSV editor 」と少しえらそうなものに改めてみた。

CSView という名前自体も変えようかと思ったが、レポジトリ名はあまりホイホイ変えるべきではないので、今回は保留とした。

これで、ユーザがちょっとくらい増えれば嬉しいところだ。


  1. (2024-03-26追記) v1.3.0 よりgithub.com/hymkor/csview/uncsv と名前を改めた
  2. 元祖は Vim らしい
  3. Release v1.1.0 · nyaosorg/go-readline-ny