У меня есть большой файл CSV, в котором все столбцы указаны с помощью "
. Нулевые значения представлены как ""
, а разделитель столбцов — |
. Я хотел бы использовать COPY
command из postgresql (версия 10.7) для проглотить эти файлы. Я перепробовал множество комбинаций, но наиболее естественной для меня является следующая:
COPY test.large
FROM '/path/to/big.file'
WITH (
FORMAT CSV,
HEADER,
DELIMITER '|',
QUOTE '"',
NULL ''
);
Моя базовая таблица ожидает столбец для целых чисел, и есть строки, в которых значение NULL
установлено на ...|""|...
вместо некоторого числа ...|"123456"|...
. И, к сожалению, это заставляет COPY
падать, говоря:
ERREUR: syntaxe en entrée invalide pour l'entier : « »
CONTEXT: COPY regpat_pct_app_reg, ligne 2743, colonne appid : « »
Извините, это на французском языке с этого терминала. Во всяком случае, там написано: Invalid syntax for integer : « »
В строке 2743 мы нашли:
...000205"|""|"XY...
Это значение NULL
, но я не могу найти, как правильно настроить командный переключатель COPY
, чтобы postgresql поглощал эти файлы.
В документации говорится:
NULL
Задает строку, представляющую нулевое значение. По умолчанию используется \N (обратная косая черта-N) в текстовом формате и пустая строка без кавычек в формате CSV. Вы можете предпочесть пустую строку даже в текстовом формате для случаев, когда вы не хотите отличать нули от пустых строк. Эта опция не разрешена при использовании двоичного формата.
Я знаю, что могу очистить файл, изменив ...|""|...
на ...||...
с помощью sed
или некоторых операций регулярного выражения/замены. Это решит мою проблему, я проверил это.
Что мне интересно: можно ли вынести это с postgresql, ведь это вполне допустимый формат CSV.
Обновить
Прочитав следующий пост, как было предложено, я написал:
COPY test.large
FROM '/path/to/big.file'
WITH (
FORMAT CSV,
HEADER,
DELIMITER '|',
QUOTE '"',
NULL '',
FORCE_NULL appid
);
Я получил:
ERREUR: l'argument de l'option « force_null » doit être une liste de noms de colonnes
Что переводится как force_null must be a list of column names
. Есть идеи?