表形式のデータを扱うとき、まず思い浮かぶのがCSVとTSV。どちらも「テキストで表を表す」フォーマットですが、区切り文字が違うだけで意外と挙動が変わります。この記事では、それぞれの特徴を整理して、どんな場面でどちらを選ぶべきか考えてみます。
CSVとは
CSV(Comma-Separated Values)は、カンマ , で値を区切るテキスト形式です。RFC 4180 で仕様が定義されています。
name,email,ageAlice,alice@example.com,30Bob,"bob, jr.@example.com",25Charlie,charlie@example.com,35ポイントをまとめるとこんな感じです。
- 区切り文字: カンマ
, - MIMEタイプ:
text/csv - ファイル拡張子:
.csv - エスケープ: カンマ・改行・ダブルクォートを含むフィールドはダブルクォート
"で囲む - ダブルクォートのエスケープ:
""と二重にする
RFC 4180ではヘッダー行はオプションですが、実務上はまず入れますよね。
エスケープの例
フィールドにカンマが入っているとどうなるか見てみましょう。
name,address,cityAlice,"123 Main St, Apt 4",TokyoBob,"456 Oak Ave, Suite 200",Osaka"123 Main St, Apt 4" のように、カンマを含むフィールドはダブルクォートで囲みます。さらにダブルクォート自体が必要なら "" でエスケープ。ちょっと面倒ですね。
id,message1,"She said ""Hello"""2,"He replied ""Goodbye"""TSVとは
TSV(Tab-Separated Values)は、タブ文字 \t で区切るテキスト形式です。IANAに text/tab-separated-values として登録されています。
name email ageAlice alice@example.com 30Bob bob@example.com 25Charlie charlie@example.com 35こちらもポイントをまとめます。
- 区切り文字: タブ
\t - MIMEタイプ:
text/tab-separated-values - ファイル拡張子:
.tsv - エスケープ: 基本的に不要(フィールド内にタブや改行を含めない前提)
TSVの最大の強みは、エスケープがほぼ要らないこと。普通のテキストにタブ文字が入ることはまずないので、処理がシンプルで済みます。
仕様比較
| 観点 | CSV | TSV |
|---|---|---|
| 区切り文字 | カンマ , | タブ \t |
| MIMEタイプ | text/csv | text/tab-separated-values |
| RFC | RFC 4180 | なし(IANAに登録あり) |
| エスケープ | ダブルクォートで囲む | 基本的に不要 |
| フィールド内改行 | ダブルクォートで囲めば可能 | 不可 |
| 人間の目での判読 | 区切りが見やすい | タブは見えにくい |
| コピー&ペースト | カンマが邪魔になることがある | スプレッドシートとの相性が良い |
CSVの落とし穴
CSVは広く使われていますが、意外とハマりどころがあります。
カンマを含むデータ
住所や金額(1,000)など、フィールドにカンマが入るケースはよくあります。ダブルクォートのルールを正しく実装しないとパースが壊れます。
改行を含むフィールド
RFC 4180ではフィールド内の改行をサポートしていますが、行単位で処理する素朴なパーサーだとうまく扱えません。
id,description1,"This is amulti-line field"2,"Single line"BOM問題
ExcelでCSVを開くとき、UTF-8のBOM(EF BB BF)がないと文字化けすることがあります。でも他のツールではBOMが邪魔になることも。どちらに合わせるか、地味に悩むポイントです。
Excelとの相性
Excelは独自のCSV解釈を持っていて、ロケールによってはセミコロン ; が区切り文字になったり、日付フォーマットが勝手に変換されたりします。これは結構やっかいです。
TSVの強み
エスケープが不要
普通のテキストにタブ文字が含まれることはまずないので、エスケープを気にせずデータを扱えます。パーサーもシンプルに書けます。
コピー&ペーストとの相性
スプレッドシート(Excel、Googleスプレッドシート)でセル範囲をコピーすると、クリップボードにはTSV形式で入ります。テキストエディタに貼り付ければそのままTSV。逆にTSVをスプレッドシートに貼れば自動でセルに分かれます。これが地味に便利。
UNIXツールとの相性
cut、awk、sort などはデフォルトでタブ区切りを想定しているものが多く、TSVとの相性が抜群です。
# 2列目を取り出すcut -f2 users.tsv
# 3列目で数値ソートsort -t$'\t' -k3 -n users.tsv使い分けの判断基準
CSVを選ぶべき場面
- 外部システムとのデータ連携: 多くのツールやAPIがCSVをサポートしている
- フィールド内にカンマ以外の特殊文字(改行など)を含むデータ: エスケープ規則があるCSVのほうが安全
- RFC準拠が求められる場面: 正式な仕様があるのはCSVだけ
- Excelでの利用が前提:
.csv拡張子ならダブルクリックで開ける
TSVを選ぶべき場面
- スプレッドシートとのコピー&ペースト連携: 最も自然なフォーマット
- データにカンマが多く含まれる: 金額、住所などカンマが頻出するデータ
- UNIXコマンドでの処理:
cut、awkなどとの相性が良い - シンプルなパース処理: エスケープ不要で実装が楽
- バイオインフォマティクス: 遺伝子データなどの分野ではTSVが標準
コードでの扱い方
JavaScriptでの簡単な例を見てみましょう。
CSVのパース(簡易版)
function parseCsv(text) { const rows = []; let current = ""; let inQuotes = false; let row = [];
for (const char of text) { if (inQuotes) { if (char === '"') { inQuotes = false; } else { current += char; } } else { if (char === '"') { inQuotes = true; } else if (char === ",") { row.push(current); current = ""; } else if (char === "\n") { row.push(current); rows.push(row); current = ""; row = []; } else { current += char; } } }
if (current || row.length > 0) { row.push(current); rows.push(row); }
return rows;}実際のプロジェクトでは、エッジケースに対応した Papa Parse などのライブラリを使うのが無難です。
TSVのパース
TSVはエスケープ規則がないので、びっくりするほどシンプルです。
function parseTsv(text) { return text .trim() .split("\n") .map((line) => line.split("\t"));}当サイトのツールで試す
当サイトの CSV/TSVビューワー では、CSVとTSVの両方を表形式で表示できます。形式を自動判定するので、データを貼り付けるだけでOK。手元のデータで違いを体感してみてください。
まとめ
CSVとTSVは同じ「表形式テキスト」を表すフォーマットですが、使い勝手に明確な差があります。
- CSV: 標準仕様(RFC 4180)があり、ツール対応が広い。ただしエスケープ処理が複雑
- TSV: エスケープが不要でシンプル。スプレッドシートやUNIXツールとの相性が良い
「とりあえずCSV」で済ませがちですが、データの特性に合わせて選ぶだけで、余計なトラブルをかなり減らせます。
CSVって一見シンプルに見えるけど、カンマ入りのデータやExcelとの相性問題で意外とハマるんだよね。あたしは最近、スプレッドシートからデータを移すときはTSVを使うようにしてるんだ。コピペがそのまま使えて楽ちん!みんなもCSV/TSVビューワーで試してみてね。