Postgres:复制错误失败导致报告的行号不一致

时间:2016-09-27 06:27:40

标签: postgresql copy

我有一个文件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可以识别行本身。但是,它无法按编号标识行。我用几个不同的文件长度做了这个,返回的行号行为是一致的。

任何人都知道原因和/或如何解决这个问题?

1 个答案:

答案 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
"

简而言之:在我们到达文件末尾之前不会发生错误。