【问题标题】:Is it possible to make the psql \copy see a line inside a csv file as a comment?是否可以让 psql \copy 看到 csv 文件中的一行作为注释?
【发布时间】:2020-10-22 01:22:05
【问题描述】:

我使用以下命令成功地将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

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

【问题讨论】:

  • 不,不支持。 COPY 不是通用的、高度可配置的加载器。

标签: postgresql psql postgresql-copy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你看 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)
    

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 2013-07-30
      • 2011-09-02
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      相关资源
      最近更新 更多