CSVとTSVの違いを実務で選ぶ基準:区切り文字、Excel、Python処理の基本
CSVとTSVは、どちらも表データをテキストで受け渡すための形式です。違いはシンプルで、CSVはカンマ、TSVはタブで列を区切る点にあります。
ただし実務では、この1文字の違いがトラブルの原因になります。商品名にカンマが入る、住所に改行が混じる、Excelで開いたら文字化けする、自動処理で列数がずれる。こうした場面では「CSVでよいか」「TSVにした方が扱いやすいか」を先に決めるだけで、後工程がかなり楽になります。
この記事で分かることは次の通りです。
- CSVとTSVの基本的な違い
- Excel、WordPress、サーバーログ、自動化処理での使い分け
- PythonでCSV/TSVを読み書きする最小例
- 区切り文字、文字コード、改行、引用符で起きやすい失敗
- JSONやExcelファイルなど、別形式を選ぶべき場面
対象読者は、Web制作、WordPress運用、サーバー管理、自動化スクリプトで表データを扱い始めた人です。コード例は Python 3 の標準ライブラリ csv を使います。
CSVとTSVの違いは「列を何で区切るか」
CSVとTSVは、どちらも1行を1レコードとして扱うテキスト形式です。違いは列の区切り文字です。
| 形式 | 区切り文字 | 拡張子 | 向いている場面 |
|---|---|---|---|
| CSV | カンマ , | .csv | Excel、管理画面、各種サービスのインポート/エクスポート |
| TSV | タブ | .tsv または .tab | テキスト処理、ログ加工、カンマを多く含む文章データ |
CSVは「Comma-Separated Values」の略で、カンマ区切りの値という意味です。RFC 4180では、CSVの一般的な形式として、各レコードを行で分け、各フィールドをカンマで区切る形が説明されています。
TSVは「Tab-Separated Values」の略で、タブ区切りの値です。IANAの text/tab-separated-values の説明では、各レコードを1行で表し、各フィールドをタブ文字で区切る形式として扱われています。
ここがポイント: CSVとTSVは「Excel用のファイル」ではなく、表データを別のツールへ渡すためのテキスト形式です。Excelはその読み書きに対応している代表的なツールの一つです。
入力例で見る違い
同じデータでも、CSVでは次のようにカンマで列を分けます。
id,name,price
1,WordPress保守,30000
2,CSV変換,12000
TSVでは、見た目では少し分かりにくいですが、列の間にタブ文字が入ります。
id name price
1 WordPress保守 30000
2 CSV変換 12000
実際のTSVファイルでは \t という2文字ではなく、キーボードのTabキーで入力されるタブ文字が入ります。エディタによっては、タブが広い空白のように表示されます。
実務ではCSVが入口、TSVが加工用になりやすい
迷ったら、外部サービスや管理画面との受け渡しにはCSV、スクリプトやCLIで加工する途中データにはTSVを検討すると判断しやすくなります。
CSVは対応ツールが多く、Excelや各種管理画面で選びやすい形式です。MicrosoftのExcelヘルプでも、テキストファイルやCSVファイルのインポート/エクスポート手順が案内されています。WordPressのプラグイン、EC管理画面、広告管理ツール、顧客管理ツールでもCSVはよく使われます。
一方でTSVは、本文や住所のようにカンマが自然に出てくるデータで扱いやすいことがあります。カンマを列区切りとして使わないため、英文の商品名や住所、説明文にカンマが含まれても、列の境界と混同しにくいからです。
CSVを選びやすい場面
CSVは「相手側がCSVを指定している」場面に強い形式です。
- Excelで開いて確認したい
- WordPressやECサイトの管理画面へインポートしたい
- 会計ソフト、広告管理画面、SaaSから出力されたデータを受け取る
- メール配信リストや商品一覧を他社ツールへ渡す
CSVの注意点は、カンマ、ダブルクォート、改行を含む値です。RFC 4180では、カンマや改行、ダブルクォートを含むフィールドはダブルクォートで囲み、フィールド内のダブルクォートは二重にする形が示されています。
たとえば次のような商品名では、カンマが区切り文字ではなく値の一部です。
id,name,memo
1,"Basic, Standard Plan","初月のみ割引"
この引用符の処理を手作業で組み立てると、後で列数がずれやすくなります。CSVを書き出すときは、文字列連結よりも、言語やツールのCSVライブラリを使うのが基本です。
TSVを選びやすい場面
TSVは「人間が少し見て、スクリプトでも処理する」場面で使いやすい形式です。
- サーバーログや集計結果を一時的に保存する
awk、cut、sortなどのCLIツールで列単位に処理する- 説明文や住所にカンマが多いデータを扱う
- Markdownやテキストエディタへ表データを貼り付ける前処理に使う
ただし、TSVにも弱点があります。IANAの説明では、TSVではフィールド内にタブを含められない形式として説明されています。つまり、自由入力のメモ欄や本文にタブが入る可能性があるなら、事前にタブを空白へ置き換える、またはCSVやJSONなど別形式を選ぶ必要があります。
PythonでCSVとTSVを読み書きする基本
Pythonでは標準ライブラリの csv モジュールでCSVもTSVも扱えます。違いは、読み書きするときに delimiter を変えるだけです。
ここでは、次のCSVを入力例にします。
id,name,price
1,WordPress保守,30000
2,"Basic, Standard Plan",12000
CSVを読む
import csv
with open("items.csv", newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["id"], row["name"], row["price"])
期待される出力は次の通りです。
1 WordPress保守 30000
2 Basic, Standard Plan 12000
Basic, Standard Plan にはカンマが含まれていますが、CSVとして正しく引用符で囲まれているため、1つの列として読めます。
Python公式ドキュメントでは、csv.reader や csv.writer を使ってCSVを読み書きする方法が説明されています。ファイルを開くときに newline="" を指定する点も、実務では覚えておきたいポイントです。
TSVを読む
TSVを読む場合は、区切り文字をタブにします。
import csv
with open("items.tsv", newline="", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter="\t")
for row in reader:
print(row["id"], row["name"], row["price"])
入力ファイルは次のような内容です。
id name price
1 WordPress保守 30000
2 Basic, Standard Plan 12000
TSVではカンマを区切り文字として見ないため、Basic, Standard Plan は引用符なしでも1つの値として扱えます。
CSVからTSVへ変換する
CSVを受け取ったあと、CLIやテキスト処理で扱いやすくするためにTSVへ変換したいことがあります。Pythonなら次のように書けます。
import csv
with open("items.csv", newline="", encoding="utf-8") as src, \
open("items.tsv", "w", newline="", encoding="utf-8") as dst:
reader = csv.reader(src)
writer = csv.writer(dst, delimiter="\t", lineterminator="\n")
for row in reader:
writer.writerow(row)
この例では、入力CSVの引用符処理を csv.reader に任せています。そのうえで、出力側だけタブ区切りに変えています。CSVを自分で split(',') しないことが重要です。
よくある失敗は「区切り文字だけ見て中身を見ない」こと
CSV/TSVのトラブルは、形式名よりも中身の文字に原因があることが多いです。区切り文字、文字コード、改行、列数を最初に確認すると、原因を切り分けやすくなります。
失敗1: CSVをカンマで単純分割する
次のようなCSVを考えます。
id,name,memo
1,"Basic, Standard Plan",有料プラン
この行を単純に split(',') すると、商品名の中のカンマまで分割されます。
line = '1,"Basic, Standard Plan",有料プラン'
print(line.split(','))
出力は次のように壊れます。
['1', '"Basic', ' Standard Plan"', '有料プラン']
改善例は、CSVパーサーを使うことです。
import csv
from io import StringIO
line = '1,"Basic, Standard Plan",有料プラン'
reader = csv.reader(StringIO(line))
print(next(reader))
['1', 'Basic, Standard Plan', '有料プラン']
CSVは「カンマがあるテキスト」ではなく、引用符や改行のルールを持つ表データとして扱う必要があります。
失敗2: Excelで開いたら文字化けする
CSVやTSVは、ファイル内に文字コードの情報を必ず持っているわけではありません。UTF-8、Shift_JIS、BOM付きUTF-8など、作成元と読み込み側の想定がずれると日本語が文字化けします。
実務では次を確認します。
- 相手の指定文字コードはUTF-8か、Shift_JISか
- Excelで直接ダブルクリックして開くのか、インポート機能で文字コードを指定するのか
- Webシステムへアップロードする場合、仕様書に文字コード指定があるか
- ファイル名だけで判断せず、実際のエンコーディングを確認したか
WordPressやWeb系の自動処理ではUTF-8を使うことが多いですが、古い業務システムや一部の国内向けCSVではShift_JIS指定が残っていることがあります。相手があるデータ交換では、先に仕様を確認するのが安全です。
失敗3: 改行入りのセルで行数がずれる
CSVでは、引用符で囲まれたフィールド内に改行が入ることがあります。説明文や問い合わせ本文をCSVに入れると、1件のデータが見た目上は複数行に見えることがあります。
id,message
1,"1行目
2行目"
この場合、行単位で単純に読み込む処理は壊れます。CSVライブラリを使えば、引用符内の改行を考慮して読めます。
TSVでは、フィールド内のタブや改行を避ける前提で運用されることが多いため、自由入力の長文をそのまま入れる用途には向きません。長文や入れ子構造を扱うなら、JSONやデータベースの方が適しています。
CSVとTSVを選ぶ実務チェックリスト
形式選びで迷ったら、ファイルを作る前に次の5点を確認します。
- 受け取り側のツールはCSVとTSVのどちらに対応しているか
- データの中にカンマ、タブ、改行、ダブルクォートが含まれるか
- Excelで人が確認する必要があるか
- CLIやスクリプトで列単位に処理する予定があるか
- 文字コード、ヘッダー行、改行コードの指定があるか
選び方の目安は次の通りです。
| 状況 | 選びやすい形式 | 理由 |
|---|---|---|
| 管理画面へ商品一覧をアップロードする | CSV | 対応サービスが多く、仕様として指定されやすい |
| カンマを含む英文や住所を多く扱う | TSVまたはCSVライブラリ利用 | TSVならカンマ衝突を避けやすい。CSVなら引用符処理が必須 |
| サーバーログをCLIで集計する | TSV | タブ区切りは列抽出やソート処理と相性がよい |
| 改行を含む本文や複雑な設定を渡す | JSONなど | 表形式だけでは構造や改行を安全に表しにくい |
| Excelで確認してから相手へ渡す | CSV | Excelや多くの業務ツールで扱いやすい |
CSV/TSV以外を選ぶべき場面
CSVとTSVは軽くて便利ですが、万能ではありません。表データの形から外れるなら、別形式を選ぶ方が安全です。
JSONが向く場面
JSONは、1件のデータの中に複数の値や入れ子構造がある場合に向いています。
{
"id": 1,
"name": "WordPress保守",
"options": ["月次バックアップ", "更新確認"]
}
CSVで同じ情報を表そうとすると、オプション列をどう分けるか、配列をどの記号で連結するかを決める必要があります。API連携や設定ファイルでは、JSONの方が自然なことが多いです。
Excelファイルが向く場面
人が手で編集し、複数シート、数式、表示形式、入力規則を使うなら、CSVよりも .xlsx の方が向いています。CSVやTSVは基本的に1つの表をテキストで保存する形式なので、シート名やセルの色、数式の意味までは保持しません。
ただし、自動処理では .xlsx よりCSV/TSVの方が扱いやすい場面もあります。サーバー上で軽く読み書きしたい、Gitで差分を見たい、ログ処理に流したい場合は、テキスト形式の強みが出ます。
まとめ:交換先が決まっているならCSV、加工中心ならTSVも候補
CSVとTSVの違いは、列をカンマで区切るか、タブで区切るかです。実務では、その違いが「どの文字をデータ内に含めやすいか」「どのツールで読みやすいか」に直結します。
最後に、判断ポイントを短く整理します。
- 外部サービスやExcelとの受け渡しでは、まずCSV指定の有無を確認する
- カンマを含む文章データでは、CSVの引用符処理かTSV利用を検討する
- TSVでは、タブや改行を含む値をどう扱うか先に決める
- 文字化け対策として、文字コードを相手と明示的に合わせる
- Pythonでは
csvモジュールを使い、手作業のsplit(',')に頼らない
次に見るべきポイントは、実際に使うツールの読み込み仕様です。同じ .csv でも、文字コード、ヘッダー行、改行コード、引用符の扱いが違えば結果は変わります。ファイルを作る前に、交換先の仕様を1つ確認するだけで、あとから直す手間を減らせます。
