【问题标题】:Exporting new line characters to text in Postgres在 Postgres 中将换行符导出为文本
【发布时间】:2022-06-13 23:04:52
【问题描述】:

Postgres 数据库中有一个包含新行的文本字段。我想将该字段的内容导出到文本文件,保留这些新行。但是,COPY TO 命令明确地将这些字符转换为\n 字符串。例如:

$ psql -d postgres -c "COPY (SELECT CHR(10)) TO '/tmp/out.txt';"
COPY 1
$ cat /tmp/out.txt
\n

这种行为似乎与documents 中的简短描述相匹配:

目前,COPY TO 永远不会发出八进制或十六进制数字反斜杠序列,但它会使用上面列出的其他序列来处理这些控制字符。

是否有任何解决方法可以在输出中获取新行?例如。像这样的命令:

$ psql -d postgres -c "COPY (SELECT 'A line' || CHR(10) || 'Another line') TO '/tmp/out.txt';"

结果如下:

A line
Another line

更新:我不希望获取 CSV 文件。输出不得包含标题、列分隔符或列修饰符,例如引号(正如上面输出中的示例)。 a different questionCOPY AS CSV 中提供的答案不满足此要求。

【问题讨论】:

  • 我认为您正在寻找的是 WITH CSV: " CSV 格式将识别并生成带有包含嵌入式回车和换行符的引用值的 CSV 文件。因此,这些文件并不是严格意义上的每行类似于文本格式文件的表格行。”

标签: postgresql psql


【解决方案1】:

根据我的评论:

psql -d postgres -U postgres -c "COPY (SELECT CHR(10)) TO '/tmp/out.txt' WITH CSV;"
Null display is "NULL".
COPY 1

 cat /tmp/out.txt 
"
"


psql -d postgres -U postgres -c "COPY (SELECT 'A line' || CHR(10) || 'Another line') TO '/tmp/out.txt' WITH CSV;"
Null display is "NULL".
COPY 1

cat /tmp/out.txt 
"A line
Another line"

使用 CSV 格式将在输出中保留嵌入的换行符。这在 CSV 格式

下的 COPY 进行了解释

每条记录中的值由 DELIMITER 字符分隔。如果该值包含定界符、QUOTE 字符、NULL 字符串、回车或换行符,则整个值都以 QUOTE 字符为前缀和后缀,并且任何出现在 QUOTE 字符或ESCAPE 字符前面是转义字符。您还可以使用 FORCE_QUOTE 在特定列中输出非 NULL 值时强制使用引号。

...

注意

CSV 格式将识别和生成带有包含嵌入式回车和换行符的引用值的 CSV 文件。因此,这些文件并不像文本格式文件那样严格地每行一行。

更新

不涉及引用的替代方法,使用psql

create table line_wrap(id integer, fld_1 varchar);

insert into line_wrap values (1, 'line1
line2');

insert into line_wrap values (2, 'line3
line4');

select fld_1 from line_wrap
\g (format=unaligned tuples_only=on) out.txt

cat out.txt 
line1
line2
line3
line4

【讨论】:

  • 我需要将此字段的内容导出到文本文件,而不是 CSV。没有标题、字段分隔符等。
  • 然后COPY table_name(field_name) TO '/tmp/out.txt' WITH CSV。除非您指定HEADER,否则将没有标题,并且单个字段没有分隔符。 COPY 是基于行(记录)的语句,因此您可以尽其所能。
  • 查看我的 UPDATE 了解替代方法。
  • psql 可以轻松实现自动化,这是一种很有价值的方法。您可以删除带有COPY 的部分,因为它肯定不会生成我需要的那种文件。同样带有Null display is "NULL". 的位返回错误:“找不到命令'Null'”(postgres-client 14)。
  • Null display is "NULL" COPY 1 部分来自连接数据库和命令的返回值。这只是意味着我在我的.psqlrc 文件中设置了\pset null 'NULL'
猜你喜欢
  • 2016-11-01
  • 2021-06-12
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2021-12-03
相关资源
最近更新 更多