Какой лучший способ сделать экспорт psql, который заменяет регулярное выражение во всех столбцах? - PullRequest
4 голосов
/ 27 февраля 2020

Я запускаю PSQL экспорта в файлы CSV для нескольких таблиц. Они выглядят следующим образом:

COPY table_name TO 'file_name' CSV

Проблема заключается в том, что некоторые из этих таблиц имеют поля text, в которых значения этих полей содержат как разделитель (запятые), так и переводы строк. Как лучше всего выполнить экспорт, удаляя символы новой строки во всех столбцах?

Пример таблицы:

field1,field2,field3,field4
field1,field2,"field3, with, the delimiter",field4
field1,field2,"field3, with, the
delimiter and newline",field4
field1,"field2 with a
newline",field3,field4

Как бы выглядел мой экспорт:

field1,field2,field3,field4
field1,field2,"field3, with, the delimiter",field4
field1,field2,"field3, with, the delimiter and newline",field4
field1,"field2 with a newline",field3,field4

Некоторые решения, которые я рассматривал:

  1. Напишите пользовательскую функцию замены регулярных выражений и обновите таблицы перед выполнением экспорта.
  2. Проверьте, есть ли способ выполнить замену во время транзакции экспорта (возможно ли это?).
  3. Выполните экспорт как есть и используйте другую библиотеку / язык для последующей обработки экспортированного файла CSV.

Спасибо за помощь!

1 Ответ

0 голосов
/ 28 февраля 2020

Вы можете автоматически составить соответствующий оператор COPY с помощью этого оператора SQL:

SELECT format(
          'COPY (SELECT %s FROM %I.%I) TO ''filename'' (FORMAT ''csv'');',
          string_agg(
             format(
                CASE WHEN data_type IN ('text', 'character varying', 'character')
                     THEN 'translate(%I, E''\n,'', '''')'
                     ELSE '%I'
                END,
                column_name
             ),
             ', '
             ORDER BY ordinal_position
          ),
          table_schema,
          table_name
       )
FROM information_schema.columns
WHERE table_schema = 'schema_name'
  AND table_name = 'table_name'
GROUP BY table_schema, table_name;

Если вы используете psql, вы можете заменить последнюю точку с запятой на \gexec, чтобы иметь psql запустите полученный оператор SQL в одном go.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...