使用Ruby中的转换器从CSV列中删除回车符

时间:2015-09-11 20:48:19

标签: ruby csv

我正在尝试在发送之前从出站CSV的列值中删除所有换行符(\ n和\ r \ n)。最直接的方式似乎是使用CSV转换器 - 但是,它似乎对我不起作用。

csv_options = {}
csv_options[:force_quotes] = true
csv_options[:col_sep] = "|"
CSV::Converters[:remove_newlines] = lambda{|s| 
  begin 
    s.tr("\n","").tr("\r","")
  rescue ArgumentError
    s
  end
}
csv_options[:converters] = [:remove_newlines]
CSV.open(local_file.path, "wb", csv_options) do |csv|
  ...

当我对此进行测试时,csv_options:force_quotes:col_sep)的其他方面都有效,但字段内的换行符仍然存在。有没有人有什么建议?请注意,由于各种原因,我无法直接删除字符串中的换行符(或CSV.open块本身内的任何位置),这就是我尝试使用转换器的原因。

编辑:根据其他用户的输入稍微加强了代码,但结果相同。我现在使用的代码是:

CSV.open(local_file.path, "wb",
          :force_quotes => true,
          :col_sep => "|",
          :converters => lambda { |s| s.tr("\n\r","") }
        ) do |csv|
  ...

1 个答案:

答案 0 :(得分:1)

因此,问题是您希望将输出转换为文件而不是输入。 :converters选项仅处理从CSV文件转换输入,在以CSV格式书写时不会应用转换。

如果您真的想要此功能,您可以将其修补:

require 'csv'

class CSV
  alias :old_init_separators :init_separators

  def init_separators(options)
    old_init_separators(options)

    if options.delete(:remove_newlines)
      old_quote = @quote
      @quote = lambda do |field|
        old_quote.call(String(field).tr("\r\n", ""))
      end
    end
  end
end

CSV.open('test.csv', 'wb',
         :force_quotes => true,
         :col_sep => '|',
         :remove_newlines => true) do |csv|

  csv << ["A\r\nB", "C\r\nD"]
  csv << ["E\r\nF", "G\r\nH"]

end

请注意添加:remove_newlines选项。

$ cat test.csv
"AB"|"CD"
"EF"|"GH"