我在解析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的构建方式。
答案 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文件,以查找杂散空间的位置。