是否可以让 psql \copy 在 csv 文件中看到一行作为注释?

Is it possible to make the psql \copy see a line inside a csv file as a comment?

我使用以下命令成功地将 csv 个文件插入 postgresql

\COPY tablename(col1, col2, col3) FROM '/home/user/mycsv.txt' WITH CSV HEADER DELIMITER ';' NULL AS 'null';

但是,我想在此 csv 文件中写入一些元数据,其中包含可重复的数据。我知道我可以创建一个不同的文件来存储此数据,但我认为将此元数据存储在存储大部分数据的同一个 csv 文件中会方便得多。我想象一个像下面这样的文件:

-- commented line with some metadata
col1;col2;col3
value;value;value
value;value;value
value;value;value

我试过使用 -- /* /*# 作为注释,但是当我这样做时 \copy 命令无法导入数据。有什么方法可以告诉 \copy psql 命令将特定行视为注释,这样我就可以插入不属于 csv 文件的行的数据?可能吗?

你看pg_dump是怎么做的:

pg_dump -d test -U postgres -t orders -a -f test.sql

cat test.sql 

--
-- PostgreSQL database dump
--

-- Dumped from database version 12.3
-- Dumped by pg_dump version 12.3

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

--
-- Data for Name: orders; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.orders (order_id, total, order_date, user_id) FROM stdin;
1       100     2020-06-20 00:00:00     1
2       250     2020-06-20 00:00:00     2
\.


--
-- Name: orders_order_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.orders_order_id_seq', 2, true);


--
-- PostgreSQL database dump complete
--


psql -d test -U postgres -f test.sql 

Null display is "NULL".
SET
SET
SET
SET
SET
 set_config 
------------
 
(1 row)

SET
SET
SET
SET
COPY 2
 setval 
--------
      2
(1 row)

使用 FROM PROGRAM 构造告诉其他东西将它们过滤掉。

\COPY tablename(col1, col2, col3) FROM PROGRAM 'egrep -v "^-- " mycsv.txt' WITH CSV HEADER DELIMITER ';' NULL AS 'null'