CSV

逗号分隔值

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

PostgreSQL 提供了多种选项来生成和导入 CSV 格式的数据,正如其名称所示,使用逗号分隔记录值(尽管也可以使用其他分隔符)。

psql

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

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

COPY

SQL 命令 COPY 可以导入和导出 CSV 文件,但只能与 PostgreSQL 系统用户可以访问的文件进行操作。

file_fdw

基于 COPY 命令底层功能构建的 file_fdw 外部数据包装器,允许将服务器本地文件系统上的 CSV 文件视为表。

CSV 日志输出格式

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

示例

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

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 ... WHEREPostgreSQL 12 开始可用)

使用 file_fdw

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

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”的评论、建议或更正,请在此处提交