2016-02-07 3 views
0

У меня есть таблица с 300000 строк не под моим контролем, что мне нужно импортироватьошибок, используя копию с в PostgreSQL, когда значение «2" %»

экспортировать данные из MySQL с помощью:.

mysqldump -u root --password=secret --fields-enclosed-by='\"' -T/tmp apflora_beob 

Затем я пытаюсь импортировать каждую таблицу, используя, например:.

\copy beob_evab FROM '/Users/alex/tmp/beob_evab.txt' (FORMAT 'csv', DELIMITER E'\t', NULL '\N', ESCAPE E'\"', ENCODING 'UTF8'); 

Это работает для большинства таблиц, а также для одного, содержащих 450000 строк Но на одном я получаю эту ошибку:

ERROR: value too long for type character varying(10) 
CONTEXT: COPY beob_evab, line 190310, column COUV_MOUSSES: "2\% \N \N \N \N \N \N \N \N \N \N 30 \N 15 \N \N \N \N \N \N \N \N \N \N \N \N 0.01 \N \N 
Bachs, Dau..." 

Когда я проверяю поле COUV_MOUSSES в строке 190'310, он содержит это значение: 2"%.

Что мне нужно изменить, чтобы заставить это работать?

Для достижения нужного результата "2""%" в соответствии с @klin (спасибо!) Мне нужно было бы добавить --fields-escaped-by='"' в команду mysqldump. Так что становится:

mysqldump -u root --password=secret --fields-enclosed-by='"' --fields-escaped-by='"' -T/tmp apflora_beob 

Проблема: в настоящее время нулевые значения экспортируются как "N.

Ну, нет проблем, я подумал и изменил команду копирования, чтобы:

\copy beob_evab FROM '/Users/alex/tmp/beob_evab.txt' (FORMAT 'csv', DELIMITER E'\t', NULL '"N', ESCAPE "'", ENCODING 'UTF8'); 

Это производит следующее сообщение об ошибке в Postgres:

ERROR: CSV quote character must not appear in the NULL specification 

И это, кажется, что представление нулевых значений может не изменяются в MySQL.

+0

не должно быть 'MySQLDump -u корень --password = секретные --fields-вложенной от =» "'-T/tmp apflora_beob'? – klin

+0

yesah' --fields-enclosed-by =' "'' тоже работает. Кажется, что он работает так же, как '--fields-enclosed-by = '\' ''. Но не мешает MySQL экспортировать '' N' в качестве нулевых значений – Alex

+0

Я имею в виду: 'mysqldump -u root -password = secret --fields-enclosed-by = '"' --fields-escaped-by = '\\' -T/tmp apflora_beob' – klin

ответ

1

Значение должно быть записано в виде

"2""%" 

Per RFC 4180 - Common Format and MIME Type for Comma-Separated Values (CSV) Files:

[5]. Each field may or may not be enclosed in double quotes (however some programs, such as Microsoft Excel, do not use double quotes at all). If fields are not enclosed with double quotes, then double quotes may not appear inside the fields.(...)

[7]. If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote. For example:

"aaa","b""bb","ccc" 
+0

большое спасибо. Пожалуйста, см. Отредактированную часть моего вопроса – Alex

+0

yep, это работает, когда я совмещаю его с заменой всех '' N' на '\ N'. Большое спасибо! – Alex