islands5 blog

日々起こったことを共有したり、思ったこと、勉強したことを書いていくブログ。普段はRailsやAWSを活用したWeb系の開発をやってます。

文字コードにはマジ、マジで気をつけよう(ていうか不注意)

csvを変換するツールの作成依頼をうけて、特に難しい処理もなかったので2つ返事でOKしました。

やりたいこと 生csv -> よしなに集計 -> 別サービスにインポート用のcsv

最初にもらったcsvをベースに正解状態になるようにスクリプトを書いていきます。 ほどなくしてスクリプトの作成は終わり、念のため別の生csvでスクリプトを試したときに悲劇は起こりました。

_人人人人人人人人人_
> 計算が合わない <
 ̄YYYYYYYY

そんなバカなと思って、ロジックの見直しなど色々行ったのですが、最初のファイル以外計算が合わないのです。

まさかな~と思ってnkfでファイルの文字コードを調べたところ...

% nkf --guess data/test4.csv                                                                                                                                                                                                                                     (git)-[master]
CP932 (CRLF)

CP932という結果
さっきまでエラー出てなかったような...
上の方をおそるおそるスクロールすると

[19] pry(main)> csv_data = CSV.read("data/test4.csv", headers: true)  
ArgumentError: invalid byte sequence in UTF-8
from /usr/local/lib/ruby/2.5.0/csv.rb:2046:in `=~'

ちゃんと出てました。。。

完全に僕の確認不足で、横着してpry上でずっとテストしていたので、読み込みに成功したcsv_dataを参照したままプログラムを実行してましたorz
pryで粘る際は、定期的にresetコマンドを実行して、環境をクリーンにしましょう

ちなみに文字コードを考慮してcsvを開く場合はこちらです。

[76] pry(main)> csv_data = CSV.read("data/test4.csv", headers: true, encoding: "CP932:UTF-8")  
=> #<CSV::Table mode:col_or_row row_count:1121>

みなさんもお気をつけください

ではでは~