Копировать в Postgres из файла с разделителями табуляции в таблицу
Я работаю над командой копирования, чтобы скопировать содержимое файла с разделителями табуляции с заголовком в таблицу в postgres. Я использовал копию ранее, поэтому я знаю, как это работает, но у меня есть вопрос относительно того, как я могу обойти некоторые данные, отсутствующие в файле.
Я предварительно сделал таблицу, чтобы иметь те же имена столбцов, что и значения в заголовке.
Некоторые из "столбцов" из файла, который я получил, просто пустые. Я поместил фальшивые данные только для того, чтобы команда работала, но это будет автоматизировано еженедельно. Мне было интересно, придется ли мне просто сказать людям, чтобы они удостоверились, что их данные верны, или есть ли способ сказать команде копирования ввести NULL вместо пустых данных.
Я подумал, что, возможно, придется поместить в пустые вкладки, и это будет действовать как ноль, но я не был уверен, что это был лучший курс действий.
1 ответ
Документация для COPY
указывает, что значение по умолчанию для NULL
с это \N
, Таким образом, изменение его на пустое, как подсказывает @a_horse_with_no_name, - путь.
Другой способ - это предварительная обработка файла с использованием любых других инструментов. Я довольно часто делаю в своих сценариях следующее:
psql dbname <<EOSQL
COPY tab FROM stdin WITH (FORMAT 'csv', DELIMITER E'\t', NULL 'NULL');
$(printf "1\t2\t3\n4\t\t6\n7\t8\t\n\t10\t11\n"| \
sed -e 's/\(\t\|^\)\(\t\|$\)/\1NULL\2/g')
\.
EOSQL
Вместо printf
Вы можете присмотреть за своим файлом. Используйте все необходимые манипуляции. Примечание: я на OSX, так sed
Синтаксис может отличаться для вас.
Кроме того, в текущем PostgreSQL CommitFest есть патч для добавления общих пре- и постпроцессоров к COPY
команда. Здесь вы можете найти всю дискуссию.