我正在将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


我一直在考虑的一些解决方案:


在执行导出之前,编写一个自定义的正则表达式替换函数并更新表。
看看是否有一种方法可以在导出事务期间进行替换(这可能吗?)。
按原样执行导出,并使用其他库/语言对导出的CSV进行后处理。


谢谢您的帮助!

最佳答案

您可以使用以下SQL语句自动编写适当的COPY语句:

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语句。

10-07 13:55
查看更多