CSVファイルの翻訳方法
TABLE OF CONTENTS
CSVは一見シンプルですが、翻訳時に問題が発生しやすい形式です。列のずれ、引用符の破損、非ラテン文字の文字化け、IDが使えない値に「翻訳」されるなどのトラブルが起こりがちです。このガイドでは、CSVファイルの構造を維持しながら安全かつ実用的に翻訳するワークフロー、QAチェックリスト、よくある問題の修正方法を紹介します。
最も簡単な方法を求める場合は、汎用のテキスト翻訳ツールにCSVテキストをコピーするのではなく、CSV対応の翻訳ツール(方法1)を使用してください。
翻訳済みファイルをインポートする前に、このガイドのQAチェックリストを実行し、列やエンコーディングの問題を早期に発見しましょう。
CSV翻訳が難しい理由
CSVはプレーンテキストですが、以下のような構造ルールがあります:
- 区切り文字:通常はカンマ(
,)、一部のロケールではセミコロン(;)が使われます。 - 引用符:テキスト値はダブルクォート(
")で囲まれることがあります。値内の引用符はエスケープ(一般的に"")が必要です。 - セル内の改行:許可されていますが、セルが適切に引用符で囲まれている場合のみです。
- エンコーディング:ファイルはUTF‑8、UTF‑8 BOM付き、またはレガシーエンコーディングの場合があります。
- 混在するデータ型:数値、日付、SKU、ID、URL、プレースホルダーなどは変更せずにそのまま維持する必要があります。
CSVを「単なるテキスト」として扱う翻訳ツールは、構造文字(区切り文字/引用符/改行)を誤って変更したり、データ型(日時/数値など)を変換してしまい、インポートが壊れる原因になります。
作業開始前に
以下の簡単な手順で、CSV翻訳時の多くのトラブルを防げます:
-
バックアップコピーを作成する
file.csv→file.original.csvとして保存してください。- CSVに顧客データが含まれている場合は、アップロード前に機密フィールドを削除または匿名化してください。
-
「翻訳しない」フィールドを特定する 以下は変更せずにそのまま維持してください:
- ID、キー、SKU、注文番号
- URL、メールアドレス、ファイルパス
- プレースホルダーや変数(
{name}、{{amount}}、%s、:count) - タグ、enum値、内部ステータスコード(
PAID、REFUNDED) - コードで使用されるフィールド(APIキー、JSON blob、HTMLスニペット)
- 不明な場合は、/what-not-to-translate を参照してください。
-
区切り文字、引用ルール、改行コードの確認
- CSVを開いて「すべてが1列に見える」場合、区切り文字が間違っている可能性があります。
- 一般的なCSVは
,を区切り文字、"を引用符として使用します(RFC 4180参照: https://www.rfc-editor.org/rfc/rfc4180)。
-
エンコーディングの確認
- 多言語コンテンツには UTF‑8 を推奨します。
- 翻訳後のCSVをWindows上のExcelで開く場合、文字化けを防ぐために UTF‑8 with BOM が必要な場合があります。
- BOMの詳細: https://unicode.org/faq/utf_bom.html
-
任意ですが推奨: 安定した
row_idの追加 後で再インポートやマッチングを行うCSVの場合、一意のキー列(例:row_id)を追加して、行の並びが変わっていないか確認できるようにします。
方法1 — CSV対応のオンライン翻訳ツール(推奨)
CSV対応の翻訳ツールは、CSVを「単なるテキスト」ではなく構造化データとして扱うため、区切り文字や引用符、行・列のレイアウトを壊しにくいです。インポート前には必ずQAチェックリストを実施してください。
ニュートラルなオプション比較
| オプション | 強み | トレードオフ | 最適な用途 |
|---|---|---|---|
| OpenL CSV Translator Online | CSV構造に特化、高速なアップロード/ダウンロード | アップロード型ワークフロー、機密データには不向き | 迅速で信頼性の高いCSVドラフト |
| DeepL / Google Cloud / AWS Translate (API) | 自動化可能、高品質、バッチ処理に適合 | エンジニアリングとCSVの丁寧な取り扱いが必要 | 多数のファイルを翻訳するチーム |
| CAT tools (Smartling, Lokalise, Phrase, etc.) | 用語管理/QA、コラボレーション | セットアップやコストが増加 | 大規模な製品/UIローカライズ |
| Spreadsheet formulas (Sheets/Excel) | 追加ツール不要 | 自動フォーマットやCSV破損のリスク | 小規模・低リスクファイルのみ |
制限事項と注意点
- 許可されていない機密データはアップロードしないでください。必要に応じて、最初にサニタイズされたCSVをエクスポートしてください。
- システムが特定のヘッダー名を必要とする場合、ヘッダー行は翻訳しないでください。
- 翻訳済みCSVをインポートする前に、必ずQAチェックリストを実行してください。
- オンラインツールを使用する場合は、ツールページでアップロード制限や対応フォーマットを確認してください。
手順
-
ツールを開く
-
言語を選択する
- 対象言語を選択してください。
-
CSVをアップロードする
.csvファイルをアップロードまたはドラッグ&ドロップしてください。- CSVに複数のテキスト列が含まれている場合、翻訳ツールは区切り文字や引用符を安全に保ちながら内容を翻訳します。
-
翻訳済みCSVをダウンロードする
products_es.csvのような分かりやすい名前で保存してください。
より良い結果のためのベストプラクティス
- ユーザー向けの列のみ翻訳する: 商品タイトル、説明、UI文字列、顧客向けのメモなど。
- コードは変更しない:
status,type,sku,category_id,url,handleは翻訳しないでください。
方法2 — Google SheetsまたはExcel
このワークフローは利用可能ですが、フォーマット、区切り文字、型を誤って変更しやすいです。
Google Sheets(小規模ファイル向け)
-
CSVをインポートする
- Google Sheets → ファイル → インポート → アップロード。
- データが1列に表示された場合は、正しい区切り文字(カンマまたはセミコロン)を選択してください。
-
「翻訳しない」列を保護する
- ID列(例: SKU、注文ID)は最初にプレーンテキストとしてフォーマットし、
00123→123の変換を防いでください。
- ID列(例: SKU、注文ID)は最初にプレーンテキストとしてフォーマットし、
-
対象列のみ翻訳する
- 新しい列で
=GOOGLETRANSLATE(A2,"en","es")を使用し、その後コピー → 特殊貼り付け → 値のみを実行してください。 - URL、プレースホルダー、コード、数式を含む列には翻訳式を適用しないでください。
- 新しい列で
-
エクスポートする
- ファイル → ダウンロード → カンマ区切り値(.csv)(Google SheetsはUTF‑8でエクスポートします)。
Excel(Windows) — UTF‑8を正しくインポート・エクスポートする方法
Excelは、エンコーディングのミスが最も頻繁に発生する場所です。文字化けや区切り文字の問題を避けるために、以下の手順を使用してください。
A) 文字化けせずにCSVをインポートする
- データ → テキスト/CSVから
- インポートダイアログで:
- ファイルの原点 / エンコーディング: 65001: Unicode (UTF‑8) を選択(バージョンによって表記が異なります)
- 区切り文字: ファイルに合わせてカンマ(
,)またはセミコロン(;)を選択
- 読み込み(またはID列をテキストとして強制指定する場合はデータの変換)をクリック
B) UTF‑8でエクスポート(およびBOMの使用タイミング)
- ファイル → 名前を付けて保存
- ファイルの種類で以下を選択:
- CSV UTF‑8 (カンマ区切り) (*.csv)(多言語テキストに推奨)
- 下流システムがBOMを拒否する場合は、スクリプト(「バッチ処理」を参照)を使ってBOMなしUTF‑8でエクスポートするか、コードエディタで再保存してください。
よくある落とし穴
- 自動フォーマット: スプレッドシートは
00123のようなIDを123に変換する場合があります。 - 日付変換:
2026-01-09が異なる表示・エクスポートになることがあります。 - 区切り文字の変更: エクスポート時にロケール設定により
;に切り替わることがあります。
この方法を使用する場合、下記のQAセクションは必須です。
上級ワークフロー — 翻訳テーブル
CSVが「翻訳する」データと「翻訳しない」データの混在の場合、翻訳対象フィールドに触れないよう、別の翻訳テーブルを作成してください。
ステップ1: 翻訳テーブルを作成
新しいCSV(またはシート)を以下のように作成します:
| row_id | field | source_text | context | translated_text |
|---|---|---|---|---|
| 101 | product_title | Wireless Mouse | E-commerce product title | ワイヤレスマウス |
| 101 | product_desc | Silent clicks, 2-year battery | Short description | 静音クリック、2年間のバッテリー寿命 |
| 102 | product_title | USB-C Charger | E-commerce product title | USB-C充電器 |
| 102 | product_desc | Fast charging for phones and tablets | Short description | スマートフォンとタブレット用の高速充電 |
| 103 | product_title | Stainless Steel Water Bottle | Product title | ステンレス製ウォーターボトル |
| 103 | product_desc | BPA-free, keeps drinks cold 24h | Short description | BPAフリー、24時間冷たさをキープ |
| 104 | product_title | Noise-Canceling Headphones | Product title | ノイズキャンセリングヘッドホン |
| 104 | product_desc | Over-ear, Bluetooth 5.3 | Short description | オーバーイヤー、Bluetooth 5.3 |
ステップ2: source_text のみ翻訳する
選んだワークフローで source_text 列を翻訳し、結果を translated_text に入れます。(CSV対応のオンライン翻訳ツールは、スプレッドシートより安全な傾向があります。)
ステップ3: 翻訳を元データに戻す
row_id + field で結合し、翻訳したテキストを元のデータセットに書き戻します。これにより、ID、価格、システムフィールドが翻訳されることはありません。
例(Python + pandas)
import pandas as pd
# Original data (keep types stable; treat IDs as strings)
orig = pd.read_csv("products.csv", dtype=str, keep_default_na=False)
# Translation table after translation
tt = pd.read_csv("translation_table_es.csv", dtype=str, keep_default_na=False)
# Reshape to one row per row_id (wide format)
wide = (
tt.pivot(index="row_id", columns="field", values="translated_text")
.add_suffix("__translated")
.reset_index()
)
merged = orig.merge(wide, on="row_id", how="left")
# Write back (example fields)
merged["product_title"] = merged["product_title__translated"].where(
merged["product_title__translated"].ne(""), merged["product_title"]
)
merged["product_desc"] = merged["product_desc__translated"].where(
merged["product_desc__translated"].ne(""), merged["product_desc"]
)
merged.drop(columns=[c for c in merged.columns if c.endswith(“__translated”)], inplace=True) merged.to_csv(“products_es.csv”, index=False, encoding=“utf-8-sig”)
#### 例(SQL join/update パターン)
```sql
-- translation_table(row_id, field, translated_text)
-- products(row_id, product_title, product_desc, ...)
UPDATE products p
SET product_title = t.translated_text
FROM translation_table t
WHERE p.row_id = t.row_id
AND t.field = 'product_title'
AND t.translated_text IS NOT NULL
AND t.translated_text <> '';
バッチ処理(複数CSVファイル)
多くのCSVファイルを翻訳する必要がある場合、手動のスプレッドシート作業を避け、再現可能なパイプラインを使用してください。
-
入力の標準化
- UTF‑8(またはインポーターが必要とする場合はUTF‑8 with BOM)に正規化します。
- すべてのファイルにマッピング用の安定したキー(
row_id/id)があることを確認します。
-
ファイルごとに翻訳テーブルを生成
- 翻訳可能なフィールドのみを
translation_table_<file>.csvに抽出します。 - すべてのファイルを1つのテーブルにまとめたい場合は、
source_fileカラムを保持します。
- 翻訳可能なフィールドのみを
-
テーブルの翻訳
- APIワークフローまたはCSV対応ツールを使ってファイルごとに翻訳します。
-
結果を結合してエクスポート
row_id + field(およびsource_fileを使用する場合はそれも)でマッピングします。- 下流システムが期待するエンコーディングでエクスポートします。
最小限のスターターループ(多くのファイルを一貫して処理):
for f in ./input/*.csv; do
base="$(basename "$f" .csv)"
# 1) 翻訳テーブルを抽出(スキーマに合わせて実装)
# 2) translation_table_${base}.csv -> translation_table_${base}_translated.csv を翻訳
# 3) 結合して ${base}_translated.csv をエクスポート
echo "Processed: $base"
done
翻訳後のQAチェックリスト
翻訳済みCSVをダウンロードした後、インポート前に以下のチェックを実施してください。
クイックチェック
- 行数を比較する(macOS/Linux):
wc -l file.original.csv file.translated.csv - 区切り文字の一貫性を確認するには、プレーンテキストエディタでファイルを開き、セパレータが同じであることを確認します。
- オプション: Pythonで列数の一貫性を検証する
python -c "import csv,sys; p=sys.argv[1]; r=list(csv.reader(open(p,newline='',encoding='utf-8'))); print('rows',len(r),'max_cols',max(len(x) for x in r))" file.translated.csv
Unicodeデコードエラーが発生した場合は、CSVをUTF-8に変換するか、utf-8-sigを試してください:
python -c "import csv,sys; p=sys.argv[1]; r=list(csv.reader(open(p,newline='',encoding='utf-8-sig'))); print('rows',len(r),'max_cols',max(len(x) for x in r))" file.translated.csv
構造チェック
- 行数が変更されていない: オリジナルと同じデータ行数であること。
- 列数が変更されていない: 各行が同じ列数であること。
- 区切り文字が変更されていない: カンマまたはセミコロンがインポーターと一貫していること。
- 引用符が有効: カンマや改行を含むフィールドが正しく引用されていること。
データ整合性チェック
- IDやキーが変更されていない:
sku,id,row_id,handleを比較する。 - URLやメールアドレスが変更されていない: 余分なスペースやドメインの翻訳がないこと。
- 数値が保持されている: 価格、数量、小数点が同じであること。
- プレースホルダーが保持されている:
{name}、{{count}}、%s、:valueがそのままであること。
翻訳品質チェック
- 用語の一貫性: 主要な製品用語が全行で同じように翻訳されていること。
- 文字数制限の遵守: UIラベルが長すぎないこと(アプリでは特に重要)。
- 言語の混在がない: 翻訳すべき一般的な元言語の単語が残っていないか確認する。
CSV翻訳でよくある問題のトラブルシューティング
1) 翻訳後に列がずれる
症状
- インポーターで「列数が正しくありません」と表示される
- 値が誤ったヘッダーの下に表示される
考えられる原因
- 翻訳されたフィールドにエスケープされていない引用符(
")が含まれている - 翻訳されたフィールドにカンマや改行が含まれているが、正しく引用符で囲まれていない
修正方法
- CSVが正しい引用ルールを使用していることを確認してください(フィールドは二重引用符で囲み、内部の引用符は
""でエスケープ)。 - 生のCSVテキストを翻訳するのではなく、CSV対応のワークフローで再翻訳してください。
2) 文字化け(mojibake)や ????、é のような文字
考えられる原因
- エクスポート/インポート時のエンコーディングの不一致(UTF‑8 とレガシー)
修正方法
- UTF‑8 でエクスポートしてください。
- WindowsのExcelを使用する場合は、UTF‑8 with BOM を試してください。
- エンコーディングが変わる可能性のある手動のコピー&ペーストは避けてください。
3) 先頭のゼロが消える(00123 → 123)
考えられる原因
- スプレッドシートの自動フォーマット(Excel/Sheets)
修正方法
- 編集/エクスポート前にID列をテキストとして扱ってください。
- データを再入力しないCSV対応のワークフローで翻訳することを推奨します。
4) 日付や小数点のフォーマットが変わる
例
1,234.56が1.234,56になる2026-01-09が09/01/2026になる
修正方法
- 数値/日付の列は翻訳しないでください。
- 値は機械可読のまま保持し、表示フォーマットのローカライズはUIレイヤーで行い、生データでは行わないでください。
5) セキュリティ問題:CSVインジェクション(Excelの数式)
翻訳されたセルが =, +, -, @ で始まる場合、Excelでファイルを開くと数式として評価されることがあります。
修正方法
- スプレッドシートで開くCSVの場合、リスクのあるセルは先頭にシングルクォート(
')を付けてエスケープするか、エクスポート時にサニタイズしてください。 - 翻訳/インポート前にユーザー提供テキストの先頭の数式文字を除去することを検討してください。
- 参考:https://owasp.org/www-community/attacks/CSV_Injection
FAQ
列を壊さずにCSVを翻訳するには?
CSV対応のワークフローを使用し、インポート前に構造を確認してください:
- CSV対応の方法(Method 1)で翻訳する
- “Quick checks” とQAチェックリストを実行し、行/列数や引用符の正当性を確認する
- CSVに機密フィールドとユーザー向けテキストが混在している場合は、“上級ワークフロー — 翻訳テーブル” を使用する
CSVの特定のカラムだけを翻訳できますか?
はい。最も安全な方法は、翻訳テーブル(row_id + source_text + context)を作成し、その部分だけを翻訳してから元に戻すことです。これにより、IDや数値フィールドが誤って変更されるのを防げます。
ヘッダー行も翻訳すべきですか?
用途によります:
- ヘッダーを翻訳する:CSVが人間によって読まれる場合(レポート、エクスポートなど)。
- ヘッダーを翻訳しない:システムやインポーターが特定のフィールド名を期待している場合(eコマースのインポート、データベース、アプリなど)。
私のCSVはカンマ(,)の代わりにセミコロン(;)を使っています。問題ありませんか?
はい。ただし、ツールやインポーターが常に同じ区切り文字を使っていることを確認してください。多くのヨーロッパのロケールではセミコロンがデフォルトです。区切り文字の不一致は、CSVインポート失敗の一般的な原因です。
セル内の複数行テキスト(改行)はどう扱えばいいですか?
CSVでは複数行のセルが許可されていますが、正しく引用符で囲む必要があります。翻訳後の内容に改行が含まれる場合は、行の分割を防ぐためにCSV対応の翻訳ツールの使用を強く推奨します。
ツール
- OpenL CSV Translator Online(CSV対応ツールの例): https://doc.openl.io/translate/csv
- Excelワークフロー向け: 「How to Translate Excel Online」も参照:/how-to-translate-excel-online
- Markdownコンテンツ向け: 「How to Translate Markdown」:/how-to-translate-markdown
- 変更してはいけない項目のルールが必要な場合: 「What Not to Translate」:/what-not-to-translate
まとめ
CSVファイルを安全に翻訳するには、構造(区切り文字、引用符、エンコーディング)を維持し、「翻訳してはいけない」フィールド(ID、URL、プレースホルダー、数値)を保護してください。CSV対応のワークフローを優先し、インポート前にQAチェックリストで検証しましょう。


