背景
以下のようなシステムの作成中に、登録件数が正確に通知されないことがあった。
- CSVファイルからデータベースにデータを登録したい
- 1行につき1件として、複数行のCSVファイルを読み込む
- データがCSVからデータベースに登録されたら、登録件数を取得してSlackで管理者に通知する
問題
以下を参考に、.count
で"\n"
の数で改行をカウントして行数を取得していたが、
登録件数が倍になって通知されることがあった。
https://rubytips86.hatenablog.com/entry/2014/03/23/091949
原因
- 複数行のセルがあると、セル内の
\n
もカウントされてしまう - 空白行があると件数としてカウントされてしまう
解決法
csvfile: 件数を取得したいCSVファイル
header_length: CSVファイルの列数-2
column_length = File.read(csvfile).gsub(/,{#{header_length},}\r\n/,'').scan("\r\n").length
countは一文字しか検索できないため、scanを使用した。
参考
追記
-
列数を使わずに実装する方法をコメント欄にいただきました。
https://qiita.com/YSU250/items/217f2af5741aff3a3924#comment-91ffdc4566adf615be91
https://qiita.com/YSU250/items/217f2af5741aff3a3924#comment-3141155df93c50665241 -
本記事で扱うCSVは以下のフォーマットであると仮定する。
- レコード区切りは
CRLF
で,セル内改行はLF
- 最終レコードに
CRLF
が付いている - 空のセルは
""
で囲まれていない
- レコード区切りは