RAILS 3 CSV“非法引用”是一个谎言

时间:2012-03-20 07:51:22

标签: ruby-on-rails ruby csv

我在解析CSV文件时遇到了问题,我收到以下错误:

  

CSV :: MalformedCSVError:第3行非法引用。

有问题的RAILS代码:

csv = CSV.read(args.local_file_path, col_sep: "\t", headers: true)

CSV文件中的第3行是:

A-067067        VO  VIA CE  0   8   8   SWCH            Ter 4, Loc Is Here, Mne,    Per Fl                                  Auia/Sey    IMAC            NEK_HW      2011-03-09 09:47:44 2011-03-09 11:50:26 2011-01-13 10:49:17 2011-02-14 14:02:43 2011-02-14 14:02:44 0   0   771 771 46273   "[O/H 15/02] B270 W31 ""TEXT TEXT 2 X TEXT SWITC"   SOME_TEXT       SOME_TEXT       N/A Name Here                               RESOLVED_CLOSED RESOLVED_CLOSED

更新:标签似乎没有出现在上面。请参阅pastebin RAW TEXT:http://pastebin.com/4gj7iUpP

我已经在StackOverflow和Google上阅读了很多线程,了解为什么会这样,我理解这一点。但上面的CSV行有完全合法的引用不是吗? CSV是制表符分隔的,并且在相关列的任一侧只有一个制表符后跟引号。该字段中有1个引号,它是双引号以逃避它。什么给出了什么?我无法解决这个问题。 :(

假设我在这里遇到了问题,我希望解决方案包含一种解决问题的方法,因为我无法控制CSV的构建方式。

1 个答案:

答案 0 :(得分:1)

您的CSV的这一部分有错:

46273   "[O/H 15/02] B270 W31 ""TEXT TEXT 2 X TEXT SWITC"   SOME_TEXT

这些部分中至少有一个有杂散空间:

46273   "
"   SOME_TEXT

我猜测“3”和双倍应该由一个或多个制表符分隔,但在引号之前有一个空格。或者,在结尾报价和“S”之间只有选项卡时,另一端的报价后面有一个空格。

CSV将双引号转义为双引号,因此:

"[O/H 15/02] B270 W31 ""TEXT TEXT 2 X TEXT SWITC"

应该是包含嵌入式引用的单个字段:

[O/H 15/02] B270 W31 "TEXT TEXT 2 X TEXT SWITC

如果您在第一个引用之前或最后一个引用之后有空格,那么由于您的字段是制表符分隔的,因此您在字段中有一个未转义的双引号,这就是您的“非法引用”错误来自的位置。

尝试通过cat -t(应该将标签显示为^I)发送您的CSV文件,以查找杂散空间的位置。