如何在 Postgresql 上将表格导出为带有标题的 CSV?

Posted

技术标签:

【中文标题】如何在 Postgresql 上将表格导出为带有标题的 CSV?【英文标题】:How to export table as CSV with headings on Postgresql? 【发布时间】:2010-11-10 08:16:04 【问题描述】:

我正在尝试通过命令行将带有标题的 PostgreSQL 表导出到 CSV 文件,但是我让它导出到 CSV 文件,但没有标题。

我的代码如下:

COPY products_273 to '/tmp/products_199.csv' delimiters',';

【问题讨论】:

您使用的是 postgres >= 8.1 吗? 我想我会制定一个升级到新版本的计划,这会让生活变得更轻松 另见***.com/q/1517635/287948 【参考方案1】:
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

如manual 中所述。

【讨论】:

请注意 HEADER 参数直到 8.1 才引入。 有点生锈了。 注意COPY 需要管理员权限。如果遇到问题,请改用\COPY 这会给你不合格的输出,最好使用“FORMAT csv”而不是“DELIMITER ','”。虽然不知道是什么版本 对于 v9.5,命令现在是 COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);【参考方案2】:

从 psql 命令行:

\COPY my_table TO 'filename' CSV HEADER

末尾没有分号。

【讨论】:

这个版本是迄今为止最好的,因为COPY 命令需要管理员权限 同样使用psql 方法,可以将输出保存在可以访问的任何地方。我只是使用psql 方法将数据从远程服务器获取到本地文件中。非常光滑。 好多了,尤其是保存到您可以访问但 postgres 用户没有访问权限的目录时。 @arilwan 使用pg_dump -h remote | pg_restore -h localhost @arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv【参考方案3】:

您还可以编写查询以仅获取选定的列数据,而不仅仅是表名。

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

具有管理员权限

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

【讨论】:

我认为您不需要在命令的 psql 版本中使用终止分号 (\COPY ...)。至少在我的 psql 版本(9.5.2)中,我不需要指定“DELIMITER”;默认是逗号。 如果我从 CSV 复制到选定字段的表格,语法如何变化【参考方案4】:

当我没有权限从 Postgres 写出文件时,我发现我可以从命令行运行查询。

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv

【讨论】:

最适合“任何环境”。最适合 1. 在 Postgresql 或客户端不需要特殊权限; 2. 可以使用相对路径; 3. 对于真正的 CSV 格式(安全引用)是安全的。 我喜欢这个,因为它具有奇异性。【参考方案5】:

这行得通

psql dbname -F , --no-align -c "SELECT * FROM TABLE"

【讨论】:

不错。请注意,这似乎不会在包含逗号的字段中转义逗号。 我喜欢这个,没有-F ,,使用|作为分隔符。谢谢! 这不是通常认为的导出功能,只是受控数据显示。区别很轻微,但很重要:这比 COPY 创建要重用的文件的语句更适合人类阅读 危险 它不适用于 CSV 格式,不适用于带有 "," .. 的数组或文本,不能正确引用 CSV。使用@Brian 的答案。 我喜欢这种形式,因为如果您从命令文件重定向输入,它就可以工作。我使用制表符分隔符,以便例如 gnumeric out.tsv 起作用。【参考方案6】:

对于我使用的 9.5 版本,它会是这样的:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

【讨论】:

【参考方案7】:

最简单的方法(使用psql)似乎是使用--csv标志:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'

【讨论】:

在我的电脑上哪里可以找到该目录? 结果保存在>之后的任何路径下。 我的版本没有 --csv 选项:psql (PostgreSQL) 11.7 (Ubuntu 11.7-0ubuntu0.19.10.1) 寻呼机在等待命令行输入终止时遇到问题。我必须添加-P pager=off【参考方案8】:

这个解决方案使用\copy 对我有用。

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"

【讨论】:

【参考方案9】:

以下是我如何使用 pgsl 连接到 Heroku PG 数据库的 power shell:

我必须先将客户端编码更改为 utf8,如下所示:\encoding UTF8

然后将数据转储到 CSV 文件中:

\copy (SELECT * FROM my_table) TO  C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'

我用~作为分隔符,因为我不喜欢CSV文件,我通常使用TSV文件,但是它不会让我添加'\t'作为分隔符,所以我使用了~ 因为它是一个很少使用的字符。

【讨论】:

【参考方案10】:

COPY 命令不受限制。受到限制的是将 TO 的输出定向到除 STDOUT 之外的任何地方。但是,通过 \o 命令指定输出文件没有任何限制。

\o '/tmp/products_199.csv';
COPY products_273 TO STDOUT WITH (FORMAT CSV, HEADER);

【讨论】:

【参考方案11】:

copy (anysql query datawanttoexport) to 'fileablsoutepathwihname' delimiter ',' csv header;

使用这个你也可以导出数据。

【讨论】:

【参考方案12】:

我发布这个答案是因为这里给出的其他答案都没有真正对我有用。我无法在 Postgres 中使用 COPY,因为我没有正确的权限。所以我选择了“导出网格行”并将输出保存为 UTF-8。

@Brian 提供的psql 版本对我也不起作用,原因不同。它不起作用的原因是显然 Windows 命令提示符(我使用的是 Windows)正在自行干预编码。我一直收到这个错误:

错误:编码“WIN1252”中字节序列为 0x81 的字符在编码“UTF8”中没有等效项

我最终使用的解决方案是编写一个简短的 JDBC 脚本 (Java),它读取 CSV 文件并将插入语句直接发送到我的 Postgres 表中。这行得通,但如果不更改编码,命令提示符也可以工作。

【讨论】:

【参考方案13】:

试试这个: "COPY products_273 FROM '\tmp\products_199.csv'DELIMITER ',' CSV HEADER"

【讨论】:

【参考方案14】:

pgAdmin 中,突出显示您的查询语句,就像使用F5 执行并按F9 一样 - 这将打开文件浏览器,以便您选择保存 CSV 的位置。

如果您使用的是 Azure Data Studio,请参阅此处的说明:Azure Data Studio: Save As CSV。

我知道这不是一个通用的解决方案,但大多数时候您只想手动抓取文件。

【讨论】:

以上是关于如何在 Postgresql 上将表格导出为带有标题的 CSV?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Databricks 上将数据框导出为 excel

导出为 PDF 时如何在文本字段中包含图像和表格?

如何在linux或windows上将java导出到jar

如何在 MS Access VBA 上将文本框注释值输入设置为表格数据插入

如何在 OSX 10.10.2 上将 R 与 PostgreSQL 连接?

如何将带有中文字符的 Excel 文件导出为 CSV?