3

Ruby on Rails アプリケーションで FasterCSV を使用していますが、現在、ファイルが無効な場合は例外がスローされます。

FasterCSV docを調べたところ、ブロックでFasterCSV::parseを使用すると、メモリをあまり割り当てずに、一度に 1 行ずつファイルを読み取るようです。ファイルに何らかのエラーがある場合、 FasterCSV::MalformedCSV例外がスローされます。

カスタム ソリューションを実装しましたが、それが最適なソリューションかどうかはわかりません (以下の回答を参照してください)。代替案を知りたい

4

3 に答える 3

1

これが私の現在の解決策です。私は改善/代替案を知ることに本当に興味があります.

# /lib/fastercsv_is_valid.rb

class FasterCSV

  def self.is_valid?(file, options = {})
    begin
      FasterCSV.parse(file, options) { |row| }
      true
    rescue FasterCSV::MalformedCSV
      false
    end
  end

end

私はこの方法を次のように使用します。

# /models/csv_importer.rb

class CsvImporter
  include ActiveRecord::Validations

  validates_presence_of :file
  validate check_file_format

...

  private

  def check_file_format
    errors.add :file, "Malformed CSV! Please check syntax" unless FasterCSV::is_valid? file
  end
end
于 2011-05-11T10:29:56.103 に答える
0

昨日、いくつかのテストを行ったところ、私のソリューションがうまく機能しないことがわかりました。最初の を実装した後、有効な CSV で空の配列を取得し続けましたis_valid。それが FasterCSV キャッシングの問題なのか、コード内の何かなのかはわかりません。また、それがテスト セットアップに関連しているかどうかもわかりませんが、safe_parse代わりにa を実装することにしました。

#/lib/faster_csv_safe_parse.rb
class FasterCSV

  def self.safe_parse(file, options = {})
    begin
      FasterCSV.parse(file, options)
    rescue FasterCSV::MalformedCSVError
      nil
    end
  end

end

ファイルが有効な場合、またはnilそうでない場合、これは解析された配列を返します。次に、次のように検証を実装できます。

# /models/csv_importer.rb

class CsvImporter
  include ActiveRecord::Validations

  validates_presence_of :file
  validate check_file_format
  attr_accessor csv_data

  def csv_data
    @csv_data ||= FasterCSV.safe_parse(file)
  end

...

  private

  def check_file_format
    errors.add :file, "Malformed CSV! Please check syntax" if csv_data.nil?
  end
end

safe_parseブロックを受け入れてファイルを 1 行ずつ解析するを実装することは可能だと思いますが、私の目的には、この単純な実装で十分であり、すべての場合に機能します。

于 2011-05-13T08:57:07.013 に答える