postgresql, как сделать, чтобы COPY интерпретировал форматированные числовые поля автоматически?

У меня есть входной файл CSV, содержащий что-то вроде:

SD-32MM-1001,"100.00",4/11/2012
SD-32MM-1001,"1,000.00",4/12/2012

Я пытался скопировать импортировать это в таблицу postgresql (varchar,float8,date) и столкнулся с ошибкой:

# copy foo from '/tmp/foo.csv' with header csv;
ERROR:  invalid input syntax for type double precision: "1,000.00"
Time: 1.251 ms

Помимо предварительной обработки входного файла, есть ли в PG некоторые настройки, позволяющие ему читать файл, подобный приведенному выше, и преобразовывать его в числовую форму в COPY? Что-то кроме КОПИИ?

Если требуется предварительная обработка, можно ли установить ее как часть команды COPY? (Не psql \copy)?

Большое спасибо.

2 ответа

Возможность предварительной обработки - сначала скопировать во временную таблицу в виде текста. Оттуда вставьте в окончательную таблицу с помощью функции to_number:

select to_number('1,000.00', 'FM000,009.99')::double precision;

Это странный CSV-файл, который заключает числовые значения в двойные кавычки, но оставляет такие значения, как SD-32MM-1001 некотируемый. На самом деле, я не уверен, что когда- либо видел такой CSV-файл.

Если бы я был на вашем месте, я бы попробовал copy против файла, отформатированного как это.

"SD-32MM-1001",100.00,4/11/2012
"SD-32MM-1001",1000.00,4/12/2012

Обратите внимание, что числа не имеют запятых. Я смог успешно импортировать этот файл с

copy test from '/fullpath/test.dat' with csv

Я думаю, что ваш лучший выбор - получить лучший форматированный вывод из вашего источника.

Другие вопросы по тегам