是否可以让 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'
我使用以下命令成功地将 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'