我有一个CSV文件,其结构如下:
"customer_id";"customer_name";"quantity";
"id1234";"Henry";"15";
使用Ruby的标准CSV库进行解析:
csv_data = CSV.read(pathtofile,{
:headers => :first_row,
:col_sep => ";",
:quote_char => '"'
:row_sep => "\r\n" #setting it to "\r" or "\n" results in MalformedCSVError
})
puts csv_data.headers.count #4
我不明白为什么解析似乎导致四列,尽管文件只包含三列。这不是解析文件的正确方法吗?
答案 0 :(得分:6)
每行末尾的;
暗示另一个字段,即使没有值。
我要么删除尾随的;
,要么在解析时忽略第四个字段。
答案 1 :(得分:0)
尾随;
是罪魁祸首。
您可以预处理文件,剥离尾随;
,但这会产生不必要的开销。
您可以使用以下内容对CSV返回的数据进行后处理:
csv_data = CSV.read(...).map(&:pop)
将迭代子数组,删除每个子数组中的最后一个元素。问题是read
不可扩展,因此您可能需要重新考虑使用它,而是使用CSV.foreach
逐行读取文件,然后在返回时弹出最后一个值你。