Postgresql COPY и CSV данные с двойными кавычками - программирование
Подтвердить что ты не робот

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? Можете сделать это, но я решил, что есть правильное решение того, что должно быть невероятно распространенной проблемой.

4b9b3361

Ответ 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 *;