CSV

逗号分隔值

CSV (逗号分隔值) 是一种用于数据交换的简单临时数据格式。

PostgreSQL 提供了许多选项来生成和导入 CSV 格式的数据,使用(顾名思义)逗号分隔记录值(尽管可以使用其他分隔符/定界符)。

psql

psql\copy 命令可以处理 CSV 文件。

PostgreSQL 12 开始,psql 可以使用 \pset format csv 或命令行 --csv 选项生成 CSV 格式的输出。

COPY

SQL 命令 COPY 可以导入和导出 CSV 文件,但仅限于访问 PostgreSQL 系统用户可访问的文件。

file_fdw

file_fdw 外部数据包装器 基于 COPY 命令的基础功能构建,使服务器本地文件系统上的 CSV 文件能够被视为表。

CSV日志输出格式

PostgreSQL 可以选择生成 CSV格式的日志文件,如果 csvlog 值包含在 log_destination 参数中。

示例

使用以下虚构的示例数据集

postgres=# CREATE TABLE csvdemo (id INT, val1 TEXT, val2 TEXT);
CREATE TABLE

postgres=# INSERT INTO csvdemo VALUES (1,'foo','bar'), (2,'baz','boo,zoo');
INSERT 0 2

postgres=# SELECT * FROM csvdemo;
 id | val1 |  val2
----+------+---------
1 | foo | bar
2 | baz | boo,zoo (2 rows)

使用psql

postgres=# \pset format csv
Output format is csv.
postgres=# SELECT * FROM csvdemo;
id,val1,val2
1,foo,bar
2,baz,"boo,zoo"

或者,从系统命令行直接执行

psql -d postgres -U postgres --csv -c "SELECT * FROM csvdemo"
id,val1,val2
1,foo,bar
2,baz,"boo,zoo"

使用 \copy

postgres=# \copy (SELECT * FROM csvdemo) to '/tmp/psql-copy.csv' (FORMAT 'csv', HEADER 'TRUE')
COPY 2

postgres $ cat /tmp/psql-copy.csv
id,val1,val2 1,foo,bar 2,baz,"boo,zoo"

使用COPY

示例来自 psql 内部,但适用于任何应用程序。

postgres=# COPY (SELECT * FROM csvdemo) to '/tmp/copy.csv' (FORMAT 'csv', HEADER 'TRUE');
COPY 2

postgres $ cat /tmp/copy.csv
id,val1,val2 1,foo,bar 2,baz,"boo,zoo" postgres $ echo '3,zoo,"fizz,buzz"' >> /tmp/copy.csv postgres=# COPY csvdemo FROM '/tmp/foo.csv' (FORMAT 'csv') WHERE id=3; COPY 1 postgres=# SELECT * FROM csvdemo; id | val1 | val2 ----+------+----------- 1 | foo | bar 2 | baz | boo,zoo 3 | zoo | fizz,buzz (3 rows)

(注意:COPY ... WHERE 可用于 PostgreSQL 12)

使用file_fdw

扩展 file_fdw 必须在 PostgreSQL 服务器上可用。

postgres=# CREATE EXTENSION file_fdw;
CREATE EXTENSION

postgres=# CREATE SERVER file_fdw_csv_test FOREIGN DATA WRAPPER file_fdw;
CREATE SERVER

postgres=# CREATE FOREIGN TABLE csv_test (
 id INT,
 val1 TEXT,
 val2 TEXT
)
SERVER file_fdw_csv_test
OPTIONS (
   filename '/tmp/copy.csv',
   format 'csv',
   header 'TRUE'
);

postgres=# SELECT * FROM csv_test;
 id | val1 |   val2    
----+------+-----------
  1 | foo  | bar
  2 | baz  | boo,zoo
  3 | zoo  | fizz,buzz
(3 rows)

分类

数据导入/导出

反馈

提交关于 "CSV" 的任何评论、建议或更正 此处