我有一个文件foo,我想将其复制到表格中。
\copy stage.from_csv FROM '/path/foo.dat' CSV;
如果foo出现列不匹配或类型错误等错误,则返回错误是正常的:
CONTEXT: COPY from_csv, line 5, column report_year: "aa"
但是,如果错误是由无关的引号引起的,则报告的行号始终大于文件的大小。
CONTEXT: COPY from_csv, line 11: "02,2004,"05","123","09228","00","SUSX","PR",30,,..."
源文件有10行,我将错误放在第5行。如果检查CONTEXT消息中的信息,它包含第5行数据,所以我知道postgres可以识别行本身。但是,它无法按编号标识行。我用几个不同的文件长度做了这个,返回的行号行为是一致的。
任何人都知道原因和/或如何解决这个问题?
答案 0 :(得分:0)
这是因为错误只出现在文件的末尾。
查看此CSV文件:
"google","growing",1,2
"google","growing",2,3
"google","falling","3,4
"google","growing",4,5
"yahoo","growing",1,2
第三行有一个错误,在"
之前添加了额外的3
。
现在解析一个CSV文件,首先阅读,然后点击下一个换行符
但要小心,双引号内的换行符不算数!
因此,所有换行符都是带引号的字符串的一部分,并且该行一直持续到文件结束。
现在我们已经阅读了我们的行,我们可以继续解析它,并注意引号的数量是不平衡的。因此错误消息:
ERROR: unterminated CSV quoted field
CONTEXT: COPY stock, line 6: ""google","falling","3,4
"google","growing",4,5
"yahoo","growing",1,2
"
简而言之:在我们到达文件末尾之前不会发生错误。