データベースのデータをCSVやTSVとしてエクスポートする際、「データが壊れた」「行がずれた」といった問題に遭遇したことはありませんか?その原因の多くは、データに含まれる「改行コード」です。
本記事では、この問題を根本的に解決するSQLのテクニックを解説します。
🧐 なぜデータ内の改行コードが問題になるのか?
CSV (Comma Separated Values) や TSV (Tab Separated Values) は、基本的に「1行=1レコード」として扱われます。
- 一般的なCSV/TSVファイル:レコードの区切りとして改行コードが使われています。
- 問題のデータ:データ自体(例:
col2の商品説明や要約)の中に改行コードが含まれています。
データ内の改行コードがあると、CSVリーダーがそれを「レコードの区切り」と誤認し、1つのセル内のデータが複数の行に分割されてしまうため、データの構造が壊れてしまうのです。
✅ 解決策:REPLACE関数で改行をスペースに置換する
この問題を解決するには、エクスポートする前に、データ内の改行コードを安全な文字(通常はスペース )に置き換える処理をSQLで行うのが最も確実です。
以下のSQLは、col2 内に含まれる主要な改行コード $(\text{`\n`}, \text{`\r`})$ をすべてスペースに置換し、cleaned_col2 という名前で出力する例です。
💻 SQLコード
SQL
SELECT
col1,
-- データ内の改行情報をスペースに置き換え
REPLACE(REPLACE(col2, '\n', ' '), '\r', ' ') AS cleaned_col2
FROM
your_table;
🛠️ コードの解説
REPLACE(col2, '\n', ' '):- LF (ラインフィード) を表す $\text{`\n`}$ をスペース $\text{` `}$ に置換します。
- Unix/Linux環境や標準的なテキストファイルの改行に使われます。
REPLACE(..., '\r', ' '):- 前の置換結果に対して、CR (キャリッジリターン) を表す $\text{`\r`}$ をスペース $\text{` `}$ に置換します。
- 古いMac環境や、Windowsの $\text{CRLF}$ $(\text{`\r\n`})$ のうち $\text{`\r`}$ 部分を処理します。
この二重の REPLACE 処理により、主要なすべての改行パターン(LF, CR, CRLF)がスペースに変換されるため、安心してCSV/TSVに出力できます。
💡 ポイント: すべての改行を完全に削除したい場合は、スペース $\text{` `}$ の代わりに空文字 $\text{`''`}$ を使ってください。ただし、可読性が低下するため、スペース置換が推奨されることが多いです。
📌 まとめ
データベースからデータを安全にエクスポートするには、データを取得するSELECT文の段階で前処理を行うのがベストプラクティスです。
| 問題 | 解決策 |
| データ内の改行 $\text{`\n`}$ や $\text{`\r`}$ がCSVの行区切りと誤認される | SQLの REPLACE 関数でこれらをスペース $\text{` `}$ に置換する |
このシンプルなSQLテクニックを活用して、データエクスポート時のトラブルを未然に防ぎましょう!


