首页 > 解决方案 > Ruby:数据没有引号,但 CSV.parse 引发 CSV::MalformedCSVError: Illegal quoting in line x

问题描述

我正在使用 ruby​​ CSV.parse 从 Google 表格中为我的 Rails 项目读取实时数据。在我的seeds.rb 文件中,我正在读取这样的csv 数据

point_csv_path = "https://docs.google.com/spreadsheets/d/{key}/gviz/tq?tqx=out:csv&sheet=points"
CSV.parse(open(point_csv_path), :headers=>true).each do |row|
   Point.create!(
      point_id: row["point_id"].to_i, 
      point_type: row["point_type"], 
      identifier: row["identifier"].to_i, 
      longitude: row["longitude"],
      latitude: row["latitude"],
      location: row["location"],
      ordering: row["ordering"].to_i)
end

对于google sheet中的数据,我是从网上手动复制粘贴的,数据根本不包含任何引号。谷歌表中的前 3 行数据如下:

point_id    point_type  identifier  longitude   latitude    location    ordering
1           sensor      1           -71.050054  42.360152   null        0
2           sensor      2           -71.049428  42.359373   null        0
3           sensor      3           -71.049337  42.358969   null        0

运行后$ rails db:seed,我收到以下错误消息

rails aborted!
CSV::MalformedCSVError: Illegal quoting in line 3.
/media/anyan/file/rails_project/db/seeds.rb:33:in `<main>'
/media/anyan/file/rails_project/bin/rails:9:in `<top (required)>'
/media/anyan/file/rails_project/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)

我知道在 stackoverflow 上有很多类似的问题,但我没有一个尝试解决我的问题。例如,添加:quote_char => "|":encoding => 'bom|utf-8'作为 CSV.parse() 的参数。我认为这与读取 csv 数据流有关,所以我将数据下载到磁盘并且我有同样的错误。我怎么解决这个问题?谢谢!

更新:将csv文件下载到本地磁盘并用VSCode打开后,前3行数据为:

"point_id","point_type","identifier","longitude","latitude","location","ordering"
"1","sensor","1","-71.050054","42.360152","null","0"
"2","sensor","2","-71.049428","42.359373","null","0"
"3","sensor","3","-71.049337","42.358969","null","0"

标签: ruby-on-railsrubycsv

解决方案


推荐阅读