为整个Rails应用程序更改CSV的列分隔符

时间:2018-08-16 19:15:16

标签: ruby-on-rails ruby csv

我正在使用Rails应用程序(CSV.generate中的默认列分隔符(“,”)使用Rails 4.2.4 & ruby version ruby 2.2.4p230生成CSV。

我现在需要将列分隔符更新为;,我可以这样做CSV.generate(:col_sep => ";"),但是我将不得不在很多地方进行替换。

我想知道是否可以在应用程序中某个适用于所有CSV.generate的通用位置上设置列分隔符,而不必在每个单独的位置上更改。

谢谢。

2 个答案:

答案 0 :(得分:0)

(当前)不是可以全局设置的选项。但是,您可以编写一个覆盖initialize的包装器,并在当前使用CSV的地方使用它。

class SSV < CSV
  # Uses Ruby 2.2.4 semantics instead of named parameters used in later versions.
  def initialize(data, options = Hash.new)
    super(data, options.merge(col_sep: ';'))
  end
end

SSV.generate('') { |ssv| ssv << ['foo', 'bar', ';'] } # => "foo;bar;\";\"\n"

(请确保在一些测试中将其包装。)

答案 1 :(得分:0)

CSV::DEFAULT_OPTIONS哈希常量保存选项的默认值,包括col_sep。由于哈希值被冻结,因此没有设置或修改这些默认值的标准方法。需要一些解决方法(或者可能是肮脏的hack):

require 'csv'
modified_defaults = CSV::DEFAULT_OPTIONS.dup
modified_defaults[:col_sep] = ';'
CSV::DEFAULT_OPTIONS = modified_defaults.freeze

最好的位置可能是在config/initializers/csv.rb中。这将使csv库在您的应用程序中全局可用,并全局重新定义默认值。

此解决方案将引发有关重新定义常量的警告。请记住,.generate不仅会使用新的默认值,而且csv库中接受col_sep选项的所有方法都将使用新的默认值。