gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:26 24 4
gpt4 key购买 nike

我试图在发送前从出站 CSV 的列值中删除所有换行符(\n 和\r)。最直接的方法似乎是使用 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 block 本身的任何位置),这就是我尝试使用转换器的原因。

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

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

最佳答案

因此,问题是您要将输出转换为文件而不是输入。 :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"

关于ruby - 使用 Ruby 中的转换器从 CSV 列中删除回车符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32531903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com