处理每行用双引号括起来的CSV

vhipe2zx  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(206)

我的第一个Stack Overflow问题!我们的一个客户给我们发送了一个CSV文件来处理,但是他们发送的方式是,每一行都用双引号括起来:

"example, header, values\r\n"
"example, first, line\r\n"
"example, second, line\r\n"
...
"etc, etc, etc\r\n"

这反过来又导致Ruby将每一行都解析为单个字段,包括头,这导致数据摄取脚本崩溃。
代码当前将其作为File对象打开,然后将其传递给带有一些可配置optionsCSV.foreach枚举器:

CSV.foreach(<File Object>, <Options Hash>).with_index(1) do |line, index|
# process a record
end

是否有一种直接的方法告诉Ruby忽略这些引号,以便它可以正确地解析各个字段?

我尝试将CSV选项中的quote_char更改为单引号,但不知何故,这实际上使事情变得更糟。在处理文件之前,我可能会做各种工作来从文件中删除这些引号,但这需要对遗留代码进行大量更改,如果可以的话,我希望避免这样做。我查阅了一些关于CSV选项的文档,但没有看到任何明显的银。
作为参考,CSV选项配置如下:

{
 headers: true,
 skip_blanks: true,
 encoding: 'bom|utf-8',
 liberal_parsing: true,
 header_converters: lambda { |f| f.downcase.strip },
 row_sep: "\r\n",
 quote_char: "'"
}
cwtwac6a

cwtwac6a1#

在解析csv之前,您必须对文件进行一些“预处理”。像这样:

#test.csv
"status,color,name\r\n"
"active,green,Norm\r\n"
"inactive,red,Herb"
# test.rb
require 'csv'

not_csv = File.readlines('test.csv')
real_csv = ""

not_csv.each{|line| real_csv += line.sub("\\r\\n","").gsub('"','') }

parsed_csv = CSV.parse(real_csv, headers: true)
puts parsed_csv[0]["status"] #=>active
puts parsed_csv[1]["name"]  #=>Herb

从控制台运行ruby test.rb

相关问题