2016-09-27 62 views
0

我有一個文件foo,我想要複製到表中。Postgres:通過失敗報告行號不一致複製錯誤

\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行的錯誤如果您檢查在上下文消息中的信息,它包含的行5點的數據,所以我知道的Postgres能識別該行本身。但是,它不能通過數字識別行。我用幾個不同的文件長度完成了這一操作,返回的行號行爲是一致的。

任何人都知道原因和/或如何解決這個問題?

回答

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 
" 

一言以蔽之:直到我們已經達到了文件的末尾,不會發生錯誤。

相關問題