Postgresql COPY и CSV данные с двойными кавычками
Пример строки CSV:
"2012","Test User","ABC","First","71.0","","","0","0","3","3","0","0","","0","","","","","0.1","","4.0","0.1","4.2","80.8","847"
Все значения после "First" - это числовые столбцы. Множество значений NULL, которые просто указаны как таковые, правильно.
Попытка копирования:
copy mytable from 'myfile.csv' with csv header quote '"';
NOPE: ERROR: invalid input syntax for type numeric: ""
Хорошо, да. Это нулевое значение. Попытка 2 на КОПИРОВАНИИ:
copy mytable from 'myfile.csv' with csv header quote '"' null '""';
NOPE: ERROR: CSV quote character must not appear in the NULL specification
Что делать? Выделите все двойные кавычки из файла перед запуском COPY
? Можете сделать это, но я решил, что есть правильное решение того, что должно быть невероятно распространенной проблемой.
Ответы
Ответ 1
В то время как некоторые продукты базы данных обрабатывают пустую строку как значение NULL, стандарт говорит, что они различны, а PostgreSQL рассматривает их как разные.
Было бы лучше, если бы вы могли создать свой CSV файл с однозначным представлением. Хотя вы могли бы использовать sed или что-то, чтобы отфильтровать файл в хорошем формате, другим вариантом будет COPY
данные в таблицу, где столбец text
может принимать пустые строки, а затем заполнять целевую таблицу. Функция NULLIF
может помочь с этим: http://www.postgresql.org/docs/9.1/interactive/functions-conditional.html#FUNCTIONS-NULLIF - она вернет NULL, если оба аргумента совпадут, и первое значение, если они этого не сделают. Итак, для вас может быть что-то вроде NULLIF(txtcol, '')::numeric
.
Ответ 2
в качестве альтернативы, используя
sed 's/""//g' myfile.csv > myfile-formatted.csv
psql
# copy mytable from 'myfile-formatted.csv' with csv header;
работает также.
Ответ 3
Я думаю, все, что вам нужно сделать, это следующее:
COPY mytable from '/dir/myfile.csv' DELIMITER ',' NULL '' WITH CSV HEADER QUOTE ;
Ответ 4
COPY mytable from '/dir/myfile.csv' DELIMITER ',' NULL ''
WITH CSV HEADER FORCE QUOTE *;