TSV ファイルは、表が入ったテキストファイルです。1 行が 1 レコードで、行の中ではタブ文字が列と列の境目を表します。形式としてはそれだけです。ヘッダーの宣言も、型の仕組みも、スキーマも、メタデータもありません。それが、この形式が 40 年生き延びてきた理由でもあり、いま挙げるような壊れ方をする理由でもあります。
テキストエディタで開くと、こんなふうに見えます。すきまに見えるところは、すべてタブ 1 文字です。
key en ja
item_mug Ceramic mug 陶器のマグカップ
item_tee T-shirt Tシャツ
3 列 3 行。そして 1 行目がヘッダーであるのは、このファイルを読むものが揃ってそう決めているからにすぎません。
TSV ファイルが実際に抱えているもの
2 つのプログラムがこのファイルについて合意できるかどうかは、次の 4 点で決まります。
- 区切り文字。 タブ、
U+0009です。境目 1 つにつきタブ 1 つ。タブが 2 つ続いていたら、それは広めの余白ではなく、あいだに空のセルが 1 つあるという意味です。 - 改行コード。 Unix と macOS では
LF、Windows ではCRLF。片方で書いたファイルをもう片方で読むと、各行の最後の列の末尾に、見えない復帰文字が 1 つ増えていることがよくあります。 - 文字コード。 いまはほぼ UTF-8 です。ただし古い Windows のツールから出てきたファイルは Shift_JIS(CP932)のことがあり、それを UTF-8 として読むと日本語が丸ごと化けます。
- BOM。 先頭に置かれた 3 バイトで、UTF-8 であることを示します。ほとんどのツールには不要ですが、Excel には事実上必要です。
この 4 つはどれも、ファイルの中に書いてありません。開く側がすべて推測するしかなく、多くの破損はここから始まります。
形式が定めていないところ
もともとのタブ区切りの取り決めには、引用符の規則がまったくありません。セルの中にタブや改行を入れることは、原理的にできません。本物の境目と区別する手段がないからです。
実際には、多くのツールが CSV から引用の作法を借りてきました。値を二重引用符で囲み、中にすでにある引用符は 2 つ重ねる、というやり方です。
key note
item_mug "サイズは 2 種類: S と L"
これは動きますし、たいていのパーサーが受け付けます。ただしこれは標準ではなく慣習です。他人のソフトが読むファイルでこれに頼る前に、その違いは知っておく価値があります。セルにどうしてもタブを入れたい場面では、たいていタブのほうを取り除くのが安全な答えです。
なぜカンマではなくタブなのか
文章にはカンマが絶えず現れます。Mug, ceramic, large は 1 つの商品名ですが、正しく引用符で囲まれないかぎり CSV では 3 列になります。そして、正しく囲まないツールはいくらでもあります。
一方、文章にタブが現れることはまずありません。文の途中でタブを打つ人はいませんし、多くの入力欄はそもそもタブを受け付けません。ですから TSV は引用符をまったく必要としないことがほとんどです。パーサーが間違えうる規則が減り、テキストエディタで開いても読める状態が保たれ、画面上で列が自然に揃います。
バイオインフォマティクスでも、ゲームのローカライズ用の書き出しでも、ログの処理でも、cut や awk や sort を通すものでも、タブ区切りが既定になっているのはそのためです。
引き換えになるのは、タブが目に見えないことです。カンマが 1 つ足りない CSV は、見ればすぐにおかしいと分かります。タブが 1 つ足りない TSV は、少し幅の広いセルにしか見えません。
TSV が壊れる 4 つの原因
表計算ソフトで開いた。 これが最大の原因です。Excel は 03-04 を 3 月 4 日として取り込み、00891 の先頭のゼロを落とし、桁の長い識別子を指数表記に変えます。そこで保存すれば、元の値はもう戻りません。
セルにタブが紛れ込んだ。 たいていはよそから貼り付けたものです。その行だけが他の行より 1 列多くなり、分かれた位置より後ろの値がすべて 1 つずつずれた場所に入ります。
目に見えない空白。 キーの末尾の半角スペース、普通の空白であるべきところに入った改行なしスペース、日本語の文字列に残った全角スペース。どれも、見た目は完全に正しいまま、参照だけを失敗させます。
改行コードの混在。 2 つの環境で編集されたファイルは、LF の行と CRLF の行が混ざった状態になります。うまく処理するパーサーもありますが、半分の行の最後の列に \r が残るパーサーもあります。
安全に開くには
原則は単純です。表計算ソフトを TSV のエディタとして使わないこと。 表計算ソフトの仕事は値を解釈することであり、その解釈こそが、ここで最も避けたいものです。
読むだけならテキストエディタで足ります。変更するなら列を理解する道具を使ってください。このサイトのエディタは空白とタブを表の中に表示します。TSV は UTF-8 のタブ区切りで保存し、レコード間の改行、BOM、末尾の改行の設定を書き出し前に示します。引用符は必要に応じて付け直します。セル内のタブなど、引用符を使わない TSV で表せない値がある場合は出力を止め、表を保持できるときに限り、引用符付きの形式への明示的な変換を提示します。
データを別の場所に持っていく必要があるなら、保存し直すより変換するほうが安全です。TSV から CSV へ、TSV から JSON へ、TSV から Excel へをご覧ください。