【问题标题】:Ruby 1.9.3. CSV - Unquoted fields do not allow \r or \n红宝石 1.9.3。 CSV - 不带引号的字段不允许 \r 或 \n
【发布时间】:2014-03-14 09:12:49
【问题描述】:

我进行了研究,但似乎没有一个解决方案适合我的情况。 我有一个 gmail 格式的 csv,从 gmail 本身导出。我的解析代码就这么简单:

CSV.open(file.path) do |csv|

错误是:

Unquoted fields do not allow \r or \n

我尝试了row_sepencoding 的组合,但它们都没有帮助。有什么想法吗?

Ruby 文件读取返回:

ruby -e 'p File.read("tmp/google.csv")'       

"\xFF\xFEN\u0000a\u0000m\u0000e\u0000,\u0000G\u0000i\u0000v\u0000e\u0000n\u0000 \u0000N\u0000a\u0000m\u0000e\u0000,\u0000A\u0000d\u0000d\u0000i\u0000t\u0000i\u0000o\u0000n\u0000a\u0000l\u0000 \u0000N\u0000a\u0000m\u0000e\u0000,\u0000F\u0000a\u0000m\u0000i\u0000l\u0000y\u0000 \u0000N\u0000a\u0000m\u0000e\u0000,\u0000Y\u0000o\u0000m\u0000i\u0000 \u0000N\u0000a\u0000m\u0000e\u0000,\u0000G\u0000i\u0000v\u0000e\u0000n\u0000 \u0000N\u0000a\u0000m\u0000e\u0000 \u0000Y\u0000o\u0000m\u0000i\u0000,\u0000A\u0000d\u0000d\u0000i\u0000t\u0000i\u0000o\u0000n\u0000a\u0000l\u0000 \u0000N\u0000a\u0000m\u0000e\u0000 \u0000Y\u0000o\u0000m\u0000i\u0000,\u0000F\u0000a\u0000m\u0000i\u0000l\u0000y\u0000 \u0000N\u0000a\u0000m\u0000e\u0000 \u0000Y\u0000o\u0000m\u0000i\u0000,\u0000N\u0000a\u0000m\u0000e\u0000 \u0000P\u0000r\u0000e\u0000f\u0000i\u0000x\u0000,\u0000N\u0000a\u0000m\u0000e\u0000 \u0000S\u0000u\u0000f\u0000f\u0000i\u0000x\u0000,\u0000I\u0000n\u0000i\u0000t\u0000i\u0000a\u0000l\u0000s\u0000,\u0000N\u0000i\u0000c\u0000k\u0000n\u0000a\u0000m\u0000e\u0000,\u0000S\u0000h\u0000o\u0000r\u0000t\u0000 \u0000N\u0000a\u0000m\u0000e\u0000,\u0000M\u0000a\u0000i\u0000d\u0000e\u0000n\u0000 \u0000N\u0000a\u0000m\u0000e\u0000,\u0000B\u0000i\u0000r\u0000t\u0000h\u0000d\u0000a\u0000y\u0000,\u0000G\u0000e\u0000n\u0000d\u0000e\u0000r\u0000,\u0000L\u0000o\u0000c\u0000a\u0000t\u0000i\u0000o\u0000n\u0000,\u0000B\u0000i\u0000l\u0000l\u0000i\u0000n\u0000g\u0000 \u0000I\u0000n\u0000f\u0000o\u0000r\u0000m\u0000a\u0000t\u0000i\u0000o\u0000n\u0000,\u0000D\u0000i\u0000r\u0000e\u0000c\u0000t\u0000o\u0000r\u0000y\u0000 \u0000S\u0000e\u0000r\u0000v\u0000e\u0000r\u0000,\u0000M\u0000i\u0000l\u0000e\u0000a\u0000g\u0000e\u0000,\u0000O\u0000c\u0000c\u0000u\u0000p\u0000a\u0000t\u0000i\u0000o\u0000n\u0000,\u0000H\u0000o\u0000b\u0000b\u0000y\u0000,\u0000S\u0000e\u0000n\u0000s\u0000i\u0000t\u0000i\u0000v\u0000i\u0000t\u0000y\u0000,\u0000P\u0000r\u0000i\u0000o\u0000r\u0000i\u0000t\u0000y\u0000,\u0000S\u0000u\u0000b\u0000j\u0000e\u0000c\u0000t\u0000,\u0000N\u0000o\u0000t\u0000e\u0000s\u0000,\u0000G\u0000r\u0000o\u0000u\u0000p\u0000 \u0000M\u0000e\u0000m\u0000b\u0000e\u0000r\u0000s\u0000h\u0000i\u0000p\u0000,\u0000E\u0000-\u0000m\u0000a\u0000i\u0000l\u0000 \u00001\u0000 \u0000-\u0000 \u0000T\u0000y\u0000p\u0000e\u0000,\u0000E\u0000-\u0000m\u0000a\u0000i\u0000l\u0000 \u00001\u0000 \u0000-\u0000 \u0000V\u0000a\u0000l\u0000u\u0000e\u0000,\u0000E\u0000-\u0000m\u0000a\u0000i\u0000l\u0000 \u00002\u0000 \u0000-\u0000 \u0000T\u0000y\u0000p\u0000e\u0000,\u0000E\u0000-\u0000m\u0000a\u0000i\u0000l\u0000 \u00002\u0000 \u0000-\u0000 \u0000V\u0000a\u0000l\u0000u\u0000e\u0000,\u0000P\u0000h\u0000o\u0000n\u0000e\u0000 \u00001\u0000 \u0000-\u0000 \u0000T\u0000y\u0000p\u0000e\u0000,\u0000P\u0000h\u0000o\u0000n\u0000e\u0000 \u00001\u0000 \u0000-\u0000 \u0000V\u0000a\u0000l\u0000u\u0000e\u0000,\u0000W\u0000e\u0000b\u0000s\u0000i\u0000t\u0000e\u0000 \u00001\u0000 \u0000-\u0000 \u0000T\u0000y\u0000p\u0000e\u0000,\u0000W\u0000e\u0000b\u0000s\u0000i\u0000t\u0000e\u0000 \u00001\u0000 \u0000-\u0000 \u0000V\u0000a\u0000l\u0000u\u0000e\u0000\r\u0000\n\u0000\u0010\u0004;\u00045\u0004:\u0004A\u00040\u0004=\u00044\u0004@\u0004,\u0000\u0010\u0004;\u00045\u0004:\u0004A\u00040\u0004=\u00044\u0004@\u0004,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000*\u0000 \u0000M\u0000y\u0000 \u0000C\u0000o\u0000n\u0000t\u0000a\u0000c\u0000t\u0000s\u0000 \u0000:\u0000:\u0000:\u0000 \u0000*\u0000 \u0000F\u0000r\u0000i\u0000e\u0000n\u0000d\u0000s\u0000,\u0000*\u0000 \u0000O\u0000t\u0000h\u0000e\u0000r\u0000,\u0000s\u0000t\u0000a\u0000r\u0000s\u0000h\u0000y\u0000n\u0000i\u0000n\u0000@\u0000g\u0000m\u0000a\u0000i\u0000l\u0000.\u0000c\u0000o\u0000m\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000\r\u0000\n\u0000"

似乎 google 文件有一个奇怪的编码:

enca tmp/google.csv                                                                                                                                                                                                    
Universal character set 2 bytes; UCS-2; BMP
  CRLF line terminators
  Byte order reversed in pairs (1,2 -> 2,1)

文件内容:

Name,Given Name,Additional Name,Family Name,Yomi Name,Given Name Yomi,Additional Name Yomi,Family Name Yomi,Name Prefix,Name Suffix,Initials,Nickname,Short Name,Maiden Name,Birthday,Gender,Location,Billing Information,Directory Server,Mileage,Occupation,Hobby,Sensitivity,Priority,Subject,Notes,Group Membership,E-mail 1 - Type,E-mail 1 - Value,E-mail 2 - Type,E-mail 2 - Value,Phone 1 - Type,Phone 1 - Value,Website 1 - Type,Website 1 - Value
Александр,Александр,,,,,,,,,,,,,,,,,,,,,,,,,* My Contacts ::: * Friends,* Other,starshynin@gmail.com,,,,,,

【问题讨论】:

  • 可能是文件的内容会帮助我们重现它,然后进行一些修复..
  • @ArupRakshit 我添加了文件内容,我假设我需要更改编码。
  • 好的.. puts Encoding.default_external 的输出是什么?
  • @ArupRakshit 它是 UTF-8
  • 你可以试试这个CSV.open(file.path, "rb:UCS-2:UTF-8") do |csv|.. 吗?让我知道结果

标签: ruby-on-rails ruby ruby-on-rails-3 csv gmail


【解决方案1】:

您可能需要在打开文件时指定编码。尝试使用类似的方法,直到您设法解码文件:

File.open(file.path, "rb:UTF-16BE").read.encode("utf-8")

您文件的编码似乎是 UTF-16,因此请尝试使用 UTF-16、UTF-16LE 和 UTF-16BE。

之后,您可以尝试将编码数据输入 CSV 阅读器,如下所示:

CSV.open(File.open(file.path, "rb:UTF-16BE")) do |csv|

并处理文件。您可能需要在某些时候将数据重新编码为 UTF-8。这完全取决于您的用例。

【讨论】:

  • 我可以通过编码读取 csv,但不幸的是,编码后文件总是格式错误#<CSV::Table mode:col_or_row row_count:1>
  • @MikhailNikalyukin 您使用了哪种编码?
  • 好的,让它像这样工作:File.open(file.tempfile, "rb:UTF-16") do |f| csv = CSV.parse(f.read, :headers => true) 但是通常的文件不是 utf-16(ucs-2) 不能使用这种方法,如何使它成为可选的,因为 ruby​​ 返回<Encoding:UTF-8> 用于 utf-16 和非 utf-16 文件。
  • github.com/brianmario/charlock_holmes 这个 gem 返回正确的编码 UTF-16LE,而 ruby​​ 表示 UTF-8
  • 如果你不确定你的输入是什么编码,你需要使用像 charlock_holmes 这样的 gem 来检测它。没有通用的方法,这可能是一项艰巨的任务。您也可以查看rubygems.org/gems/rchardet19
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
相关资源
最近更新 更多