CSVの改行コード問題:CRLFとLFの違いと統一する方法
CSVファイルを別の環境に渡したら「行がうまく分割されない」「全部1行に見える」「空行が大量に入る」——こうしたトラブルの原因は、たいてい改行コードです。
改行コードはテキストファイルの「目に見えない文字」で、OSによって違うものが使われます。WindowsとMac/Linuxの間でCSVをやりとりしたり、異なるシステム間でデータ連携したりする場面では、改行コードの違いが思わぬエラーの原因になります。
改行コードの種類
| 名称 | コード | バイト表現 | 主なOS |
|---|---|---|---|
| CRLF | \r\n | 0D 0A | Windows |
| LF | \n | 0A | Mac (macOS) / Linux |
| CR | \r | 0D | 古いMac (OS 9以前) |
CRは「Carriage Return(復帰)」、LFは「Line Feed(改行)」の略です。Windowsはこの2文字の組み合わせ(CRLF)を使い、Mac/Linuxは LF だけを使います。CRだけを使うのは1990年代のMacで、現在はほぼ見かけません。
名前の由来はタイプライターの動作です。CRで印字ヘッドを左端に戻し(復帰)、LFで紙を1行分送る(改行)。Windowsはこの2つの動作を律儀に再現しているわけです。
改行コードが原因で起きるトラブル
全データが1行に見える
WindowsのCRLF形式で作ったCSVを、LFしか認識しない古いシステムに渡すと、改行が認識されず全データが1行として扱われることがあります。逆に、LF形式のCSVをCRLFしか認識しないシステムに渡しても同様です。
空行が大量に入る
CRLFのCSVをLF環境で処理すると、CRが余分な文字として残り、行末に見えない\rが付着します。このCSVをさらに別のシステムに渡すと、\rが行区切りとして解釈されて空行が大量発生する、というカオスな状況になることがあります。
diff(差分比較)で全行が「変更あり」になる
同じ内容のCSVなのに、片方がCRLF、もう片方がLFというだけで、テキスト比較ツールが「全行が異なります」と判定してしまいます。改行コードを統一してから比較しないと、本当の差分が見えなくなります。
Gitで「改行コードだけの差分」が大量に出る
CSVファイルをGitで管理していると、WindowsとMacの開発者が混在するチームでは改行コードの差分が大量に出ます。Gitのcore.autocrlf設定で対処できますが、CSVファイルの場合はこの設定が意図しない変換を引き起こすこともあるため注意が必要です。
改行コードを確認する方法
テキストエディタで確認
VSCodeなら、ステータスバーの右下に「CRLF」または「LF」と表示されます。クリックするだけで切り替えも可能です。サクラエディタやTeraPadでも同様の表示があります。
コマンドラインで確認
# Mac / Linux: CRLFが含まれているかチェック
file data.csv
# → data.csv: ASCII text, with CRLF line terminators
# CRLFの箇所を可視化
cat -A data.csv | head -3
# → ID,Name,City^M$ ← ^M がCR(\r)の表示
# Windows PowerShell
(Get-Content data.csv -Raw) -match "`r`n"
# → True ならCRLF
ツールで確認
CSV Rescueのバリデーションツールは、ファイルの改行コードを自動検出して表示します。CRLFとLFの混在がある場合は「改行コードの混在」として警告してくれます。
改行コードを統一する方法
テキストエディタで変換
VSCodeの場合:ステータスバー右下の「CRLF」(または「LF」)をクリックし、変換先の改行コードを選択して保存するだけです。
コマンドラインで変換
# CRLF → LF(Mac / Linux)
sed -i 's/\r$//' data.csv
# LF → CRLF(Mac / Linux)
sed -i 's/$/\r/' data.csv
# Windows PowerShell: LF → CRLF
(Get-Content data.csv -Raw) -replace "`n", "`r`n" | Set-Content data-crlf.csv
Pythonで変換
# CRLF → LF
with open('data.csv', 'rb') as f:
content = f.read()
content = content.replace(b'\r\n', b'\n')
with open('data_lf.csv', 'wb') as f:
f.write(content)
CSV Rescueの文字コード変換ツール
文字コードの変換と同時に改行コードの変換も行えます。「出力先の文字コード」と「改行コード」を指定して変換ボタンを押すだけです。コマンドラインに慣れていない方はこちらが簡単です。
文字コードと改行コードをまとめて変換。ドロップして選ぶだけ。
文字コード変換ツール →どの改行コードを使うべきか
結論から言うと、インポート先のシステムが指定する改行コードに合わせるのが正解です。指定がなければ、以下を参考にしてください。
Webサービスへのインポートなら、LFが安全です。最近のWebサービスは大半がLinuxベースで動いているため、LFが自然な選択です。CRLFでも受け付けるサービスがほとんどですが、まれにCRが原因でトラブルになることがあります。
Excelで開くCSVなら、CRLFの方が確実です。Windowsの標準的な改行コードなので、Excelとの相性が良いです。
システム間連携では、仕様書を確認するのが一番です。明記されていなければ、LFにしておけば大抵のケースで問題ありません。
混在を防ぐための習慣
改行コードのトラブルを防ぐために、日常的にできることがあります。
まず、チームでCSVを扱うなら改行コードのルールを決めておくことです。「CSVはLF統一」「Windowsユーザーは保存時にLFを指定」のように明文化しておくと、後で困ることが減ります。
次に、CSVを編集する前にバリデーションツールでチェックする習慣を付けることです。改行コードの混在は目に見えないため、ツールでの検出が確実です。
そして、インポート前にもう一度チェック。編集過程で改行コードが変わってしまうことは珍しくないので、最終確認として改行コードを確認する習慣があると安心です。
まとめ
改行コードは「目に見えない」からこそ厄介です。CRLFとLFの違い自体はシンプルですが、OSやツールの違いによって意図せず改行コードが変わり、トラブルの原因になります。
対策は、①使う改行コードを決める、②編集前後にチェックする、③必要なら変換ツールで統一する——この3つを押さえておけば、改行コードに振り回されることはなくなるはずです。