Процитированные значения NULL приводят к сбою команды PostgreSQL COPY - PullRequest
0 голосов
/ 23 октября 2019

У меня большой CSV-файл со всеми столбцами, указанными с ". Нулевые значения представлены как "", а разделитель столбцов - |. Я хотел бы использовать команду COPY из 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. Есть идеи?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Кажется, что это небольшое несоответствие в переключателях команды COPY, потому что следующий вызов:

COPY test.large
FROM '/path/to/big.file'
WITH CSV HEADER DELIMITER '|' QUOTE '"' FORCE NULL appid;

Работает, как ожидается, или вы должны добавить _, если используете пару ключ-значениезапись:

COPY test.large
FROM '/path/to/big.file'
WITH (
    FORMAT CSV,
    HEADER,
    DELIMITER '|',
    QUOTE '"',
    FORCE_NULL (appln_id)
);
1 голос
/ 23 октября 2019

Это не NULL, это пустая строка, это совсем другое. Я не знаю, как заставить PG рассматривать пустую строку как нулевое число. Я рекомендую вам выполнить импорт во временную таблицу с текстовым столбцом вместо целого числа, а затем переместить данные в основную таблицу, преобразовав их в соответствующее число

Посмотрите на этот вопрос: PostgresqlCOPY пустая строка как NULL не работает

Очень похоже на ваш сценарий, и принятый ответ описывает похожую технику

...