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