要件:文字コードUTF-8、カラム内改行削除、カラムはダブルクオートで囲む
受け取り側もシステムで受け取るようなケース
対応方法(Ruby)
to_csv.rb
class Item < ActiveRecord::Base; end
CSV.open(outfile + "/output.csv", "w", force_quotes: true) do | writer |
header = Item.attribute_names.dup
writer << header
Item.find_each(:batch_size=>1) do |item|
row = item.attributes.values
writer << row.map{ |e| e.to_s.gsub(/(\r\n|\r|\n)/, "") }
end
end
実施テスト項目
vimでutf-8形式のまま開いて、以下を確認。
- \r\nが存在しない
- 正規表現 /\r\n/ の検索結果が0個であることを確認
- \r改行が存在しない
- 正規表現 /\r/ の検索結果が0個であることを確認
- \n改行は、各行の末尾以外に存在しない
-
正規表現 /[^\"]\n/("の直後以外の改行)の検索結果が0個であることを確認
(/\"\n/("の直後の改行)であれば全行末尾にマッチする) - 文章中の改行を含むcsvでは /[^\"]\n/("の直後以外の改行)で、不正改行を検出できる。
-
正規表現 /[^\"]\n/("の直後以外の改行)の検索結果が0個であることを確認
- 文章内の"(ダブルクォート)はエスケープ「""」されている
- 正規表現 /[^\,\"]\"[^\,\"]/ (「,」or「”」に隣接しない孤立した「"」)の検索結果が0個であることを確認
- 正規表現/[^\,]\"[^\,]/ (「,」に隣接しない「"」)でエスケープされたダブルクオート「""」にマッチすることも確認
※ UTF-8版だけだとExcelなどで最終データの確認ができないため、できれば下記のShift_JIS版も作成して出力データの確認を行うほうがよい。
要件:文字コードShift_JIS、カラム内改行削除、カラムはダブルクオートで囲む
受け取り側がWindows(Excel)で閲覧するようなケースはShift_JISで出力する。
もしくはUTF-16LEのタブ区切りファイルでもExcelで閲覧可能。
対応方法(Ruby)
to_csv.rb
class Item < ActiveRecord::Base; end
CSV.open("/output.csv", "w", :encoding => "Windows-31J", :row_sep => "\r\n", force_quotes: true) do |writer|
header = Item.attribute_names.dup
writer << header
Item.find_each(:batch_size=>1) do |item|
row = item.attributes.values
writer << row.map{|e| e.to_s.sjisable }.map{|e| e.gsub(/(\r\n|\r|\n|\f)/,"") }
end
end
String.sjisable
メソッドはコチラを参照
実施テスト項目
- 上記、UTF-8版の確認と同様の項目を確認
-
nkf -guess で文字コードがshift-jisであること
$ nkf --guess rentalcars_new.csv
Shift_JIS (CRLF)
SJISに変換し、Excel上でカラムずれが発生していないことを確認。
- 目視で左右、上下の末端行に凸凹がないことを確認
-
全カラム選択し、行の境をダブルクリック(セルの高さを改行にあわせて表示)し、
高さが広がった行(改行を含む行)が存在しないことを目視確認
ファイルのデータに問題が無いかExcelで確認
-
カラムヘッダ(見出し)とデータがズレていないか、数点サンプリングして、CSVデータとデータ取得元(Webサイトなど)を目視で比較して最終確認。
- ここで、同一値が多いレコード(データが「1」の列だらけなど)をサンプルに選ぶと、見出しがズレていても数値が元データと同一になり間違いを見落とす。
(1と1は入れ替わっても気づけない) -
カラムヘッダのズレに気づくために、各カラムの数値がバラけたレコードをサンプルとして選択する。
- 1 or 0 のセルがずらりと並ぶようなデータ項目の場合、入れ替わりによる見逃しの確立が高まるので、各カラム単位で1と0両方のレコードをサンプリングし、元データとの比較を行う。
(ただし、カラム数 x 2回の確認が必要になるので、工数は増える)
- 1 or 0 のセルがずらりと並ぶようなデータ項目の場合、入れ替わりによる見逃しの確立が高まるので、各カラム単位で1と0両方のレコードをサンプリングし、元データとの比較を行う。
- ここで、同一値が多いレコード(データが「1」の列だらけなど)をサンプルに選ぶと、見出しがズレていても数値が元データと同一になり間違いを見落とす。
- オートフィルタを使用し、データに空白・nilが無いか?異常値が含まれていないか確認
-
いくつかの項目を&で文字連結しユニークなidを作成し、idの重複が無いか確認
- ブランド「uniqro」、商品名「ストライプシャツ」、カラー「ホワイト」、サイズ「M」などの項目を文字連結して、「uniqroストライプシャツホワイトM」という文字列の新規カラム列をエクセル内に作成する。
- この列で重複するセルが無いか、countif関数などを利用して確認する。重複行があれば、データの二重登録が起きていないかなどを確認する。
- 多くの場合、元データを見ると、重複行を分ける新規のデータ項目があることが多い。
(「会員価格」「非会員価格」の価格の異なる「uniqroストライプシャツホワイトM」、など)
- ブランド「uniqro」、商品名「ストライプシャツ」、カラー「ホワイト」、サイズ「M」などの項目を文字連結して、「uniqroストライプシャツホワイトM」という文字列の新規カラム列をエクセル内に作成する。