CSVの機能を設計・実装する上でのアレコレを備忘録としてまとめました。
特別な理由がない限り、出力項目はダブルクォーテーションで囲むのが安全です。
これは、出力項目にカンマや改行など CSV上で特別な意味を持つ記号が含まれている可能性があるためです。
最初の項目名が ID
のような名前になっていると、古いExcelで誤動作を引き起こす可能性があります。
※現在のExcelでも発生するかは未検証ですが、念のため避けておくとよいでしょう。
よく使われる文字コードは以下の2つです。
Shift_JIS(Windows-31J)
UTF-8(BOM付き)
ExcelでCSVを開く想定の場合、UTF-8にBOMを付けないと文字化けするケースがあります。
そのため、BOM付きUTF-8を使う場面も多いです。
1対多の関係(例:ユーザーと趣味など)をCSVで扱う場合、以下のようにカラムを動的に増やす構成があります:
ユーザーID | 趣味1 | 趣味2 |
---|---|---|
1 | 野球 | サッカー |
あるいは、1行に1趣味ずつ分ける構成もあります:
ユーザーID | 趣味 |
---|---|
1 | 野球 |
1 | サッカー |
※システム的には、1カラム内に「カンマ区切り」などで趣味を詰め込む方法もありますが、Excel等での編集性を考慮すると現実的ではないかもしれません。
CSVは大量データの出力が前提になることが多く、処理時間にも注意が必要です。
※非同期ステータスの表示方法としては、ポーリングで進捗確認する or ステータス一覧画面を作る方法もあります。
大量データを処理する際は、アプリケーション側のメモリ消費にも注意が必要です。
Railsなら find_each
を使うことで、メモリ消費を抑えた分割処理が可能です。
CSVからのデータ取込もまた重い処理になることがあります。
基本的には非同期処理を想定して設計すべきです。
バリデーションでマスタ参照を都度SQLでチェックすると重くなる
→ 可能なら 一括で必要なマスタを取得し、配列で検証
バルクインサート/アップデートができると早いが、親IDが必要なケースでは難しいことも
並列処理の導入も有効
例:1000件を10スレッドで100件ずつ並行処理
※取込順に意味がない(更新が上書きされてもOK)なら、並列処理は特に効果的
CSV取り込み時にエラーが起きた場合は、どの行のどの項目がなぜ失敗したのかを明示することが重要です。
これがないと、ユーザーはCSVを修正できず、結果として:
といった状況に陥ります。
CSVは単純なようでいて、文字コード・出力形式・処理性能・UI/UX・運用のしやすさなど様々な設計ポイントがあります。
一度しっかり考えて実装方針を決めておくと、あとで苦しまなくて済むことが多いです。