Log目次

【設計】CSVの処理について考える

作成日 2025-04-20更新日 2025-08-05

はじめに

CSVの機能を設計・実装する上でのアレコレを備忘録としてまとめました。


基本的なフォーマット

特別な理由がない限り、出力項目はダブルクォーテーションで囲むのが安全です。
これは、出力項目にカンマや改行など CSV上で特別な意味を持つ記号が含まれている可能性があるためです。


避けた方がいい項目名

最初の項目名が ID のような名前になっていると、古いExcelで誤動作を引き起こす可能性があります。

※現在のExcelでも発生するかは未検証ですが、念のため避けておくとよいでしょう。


文字コード

よく使われる文字コードは以下の2つです。

ExcelでCSVを開く想定の場合、UTF-8にBOMを付けないと文字化けするケースがあります。
そのため、BOM付きUTF-8を使う場面も多いです。


1対多のデータをどう表現するか

1対多の関係(例:ユーザーと趣味など)をCSVで扱う場合、以下のようにカラムを動的に増やす構成があります:

ユーザーID趣味1趣味2
1野球サッカー

あるいは、1行に1趣味ずつ分ける構成もあります:

ユーザーID趣味
1野球
1サッカー

※システム的には、1カラム内に「カンマ区切り」などで趣味を詰め込む方法もありますが、Excel等での編集性を考慮すると現実的ではないかもしれません。


出力時間(タイムアウトの考慮)

CSVは大量データの出力が前提になることが多く、処理時間にも注意が必要です。

対策例

非同期処理の例

  1. 画面で「CSVダウンロードボタン」を押す
  2. バックエンドで非同期ジョブをキック
  3. すぐに画面レスポンスを返す(例:「CSV作成中です」)
  4. 作成完了後にメール送付 or ストレージに保存

※非同期ステータスの表示方法としては、ポーリングで進捗確認する or ステータス一覧画面を作る方法もあります。


メモリの考慮

大量データを処理する際は、アプリケーション側のメモリ消費にも注意が必要です。

Railsなら find_each を使うことで、メモリ消費を抑えた分割処理が可能です。


CSV取り込みに関して

CSVからのデータ取込もまた重い処理になることがあります。
基本的には非同期処理を想定して設計すべきです。

トランザクション設計

マイクロサービス連携との兼ね合い

パフォーマンス改善の工夫

※取込順に意味がない(更新が上書きされてもOK)なら、並列処理は特に効果的


CSV取込時のエラー表示

CSV取り込み時にエラーが起きた場合は、どの行のどの項目がなぜ失敗したのかを明示することが重要です。

これがないと、ユーザーはCSVを修正できず、結果として:

といった状況に陥ります。


おわりに

CSVは単純なようでいて、文字コード・出力形式・処理性能・UI/UX・運用のしやすさなど様々な設計ポイントがあります。
一度しっかり考えて実装方針を決めておくと、あとで苦しまなくて済むことが多いです。