我正在尝试在发送之前从出站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|
...
答案 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"