2016-09-27 1 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 
" 

В двух словах: ошибка не происходит, пока мы не достигли конца файла.

Смежные вопросы