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