すべてのガイド

TSV・CSV のガイド

TSV と CSV、どちらを使うべきか

仕事は同じです。壊れ方が違い、その違いこそが、どちらを選ぶべきかを決めます。

どちらもテキストの表です。一方は列をカンマで区切り、もう一方はタブで区切ります。以下のすべては、そのたった 1 つの違いから出てきます。

短い答え

TSV を選ぶのは、中身が人の書いた文章のときです。名前、説明文、翻訳、ログのメッセージ。文章はカンマだらけで、タブはほとんど含みません。ですから TSV は、エスケープをまったく必要としないことがほとんどです。

CSV を選ぶのは、下流の何かがそれを要求するときで、これは実際よくあります。どんなツールも黙って受け付けてくれる形式であり、相手が誰か分からない状態でファイルを渡すなら、こちらのほうが安全な既定です。

以下は、その理由です。

引用符——本当の違い

CSV にはこれについての仕様があります。RFC 4180 です。データの中にカンマが絶えず現れる以上、必要になったものです。

key,name
item_mug,"Mug, ceramic"
item_tee,"He said ""fits well"""

読む側も書く側も、囲むこと・重ねること・外すことを正しく実装しなければなりません。ほとんどは正しく実装しています。そうでないものが吐き出すのは、商品名 1 つが黙って 2 つの列に化けたファイルです。しかも行としては解析できてしまうので、どこからもエラーは出ません。

同じものを TSV にすると、引用符は 1 つも要りません。

key	name
item_mug	Mug, ceramic
item_tee	He said "fits well"

規則が少なければ、間違えられる箇所も少なくなります。タブを選ぶ理由は、突き詰めればこれだけです。

TSV のほうが弱いところ

タブは目に見えません。 そのすきまがタブ 1 つなのか、タブ 2 つなのか、誰かが手で打った半角スペースの並びなのか、見ただけでは分かりません。CSV のカンマの欠落は一目で分かりますが、タブの欠落は分かりません。

タブを食べてしまうツールがあります。 タブ区切りのかたまりをチャットや Web のフォーム、リッチテキストの欄に貼ると、タブが半角スペースになったり、消えたりすることがあります。カンマは必ず生き残ります。

慣習であって、標準ではありません。 CSV には RFC があります。タブ区切りにあるのは、広く共有された習慣です。ほとんどのパーサーは TSV の中でも CSV 式の引用符を受け付けますが、それを保証するものは何もありません。

CSV のほうが弱いところ

区切り文字が、いつもカンマとはかぎりません。 小数点をカンマで書く地域——ヨーロッパの大半——では、Excel は CSV をセミコロン区切りで書き出し、それでも CSV と呼びます。ある同僚の環境では完璧に開くファイルが、別の同僚の環境では 1 列になって届きます。タブに、この種の地域差はありません。

バグはエスケープに棲んでいます。 CSV の処理で「ファイルが壊れている」と報告されるもののほとんどは、重ねられなかった引用符か、改行を含む引用フィールドを素朴な split('\n') で真っ二つにしたことに行き着きます。

表計算ソフトを呼び寄せます。 .csv ファイルは、たいていの環境で表計算ソフトのアイコンを持っています。それをダブルクリックすることは、識別子を日付に変える最短の道です。

共通する弱点のほうが、実は重要

どちらの形式も、自分の文字コードも、改行コードも、ヘッダー行があるかどうかも記録していません。どれもファイルを開く側が推測します。ですから、どちらも同じように次の問題を抱えます。

  • Excel の取り込み時の推測 — 03-04 が日付になり、先頭のゼロが消え、桁の長い数値が指数表記になる。
  • 文字コードの食い違い — UTF-8 のファイルを Shift_JIS として読む、あるいはその逆。
  • 改行コードの混在 — LF で終わる行と CRLF で終わる行が混ざる。

タブとカンマのどちらを選んでも、これらは 1 つも解決しません。解決するのは、表計算ソフトでそのファイルを開かないことです。

実際の選び方

状況 形式
自由記述、説明文、翻訳 TSV
相手のツールや人が分からないまま渡す CSV
cut・awk・sort を通すデータ TSV
カンマは含むがタブは含まないデータ TSV
.csv しか受け付けない相手 CSV、正しく引用符を付けて
ヨーロッパの同僚が Excel で開く セミコロン区切りの CSV、または XLSX

相互に変換する

変換そのものは文字 1 つ分ですが、エスケープはそうではありません。タブからカンマへ向かうときは、カンマや引用符を含むセルをすべて囲む必要があります。逆向きでは、2 行にまたがる引用フィールドを含めて、正しく外す必要があります。

どちらの向きもブラウザで変換できます——TSV から CSV へとCSV から TSV へ。UTF-8 で保存し、TSV はタブ、CSV はカンマで区切ります。レコード間の改行、BOM、末尾の改行を書き出し前に確認してください。引用符は付け直します。引用符なしではセルを保てない場合、可能なときに限り明示的な引用符の変換を提示します。表計算ソフトで使うなら、Excel に直接書き出して、現在のセルの文字列を新しいブックに保存できます。