Techioz Blog

SmarterCSV ファイルの終わりに達しましたが、Ruby の CSV ライブラリはファイルを処理できます

概要

基本的に同じ CSV ファイルが 2 つありますが、何らかの理由で、SmarterCSV は bad_file という名前の CSV ファイルを読み取ることができません。両方のファイルの要点を次に示します。 Ruby のネイティブ CSV ライブラリは bad_file を問題なく読み取ることができます。

各ファイルを処理する前。以下のコードを使用して、ヘッダー行より上のすべてを削除します。

  def self.clean(file)
    if (csv = File.read(file).gsub!(/\A.+?(?=^Date,)/m, ''))
      tempfile = Tempfile.new('file_name')
      tempfile.write(csv)
      tempfile
    else
      file
    end
  end

次に、そのファイルを次のようによりスマートな CSV に渡します。

    File.open(file, encoding: 'bom|utf-8') do |f|
      chunk = SmarterCSV.process(f, {
                                   verbose: true,
                                   remove_empty_hashes: true,
                                   col_sep: :auto,
                                   force_utf8: true,
                                   force_simple_split: true,
                                   strip_chars_from_headers: /[\-"\xEF\xBB\xBF]/,
                                   duplicate_header_suffix: ''
                                 })
    end

CSV ファイルの何が違うのか、ましてやなぜ SmarterCSV が不良ファイルを処理できないのかさえわかりません。また、スプレッドシートの上部から不要な情報を削除するより良い方法を誰かが持っていれば、この問題はすぐに解決する可能性があります。

解決策

CSV ファイルの BOM マーカーに問題がありました。問題 219 を参照してください。

この問題は、SmarterCSV バージョン 1.8.0 以降で修正されました。