【问题标题】:Import csv file beginning on specific line number从特定行号开始导入 csv 文件
【发布时间】:2018-01-12 21:37:28
【问题描述】:

我想将 csv 文件导入到从 csv 文件第 9 行开始的表中。如何在 postgresql 中指定这个条件?

前 8 行有一堆不相关的文字描述下面的数据。这是导入 Excel 的文件的屏幕截图。

这是我试图将数据插入到我的数据库中的表。

CREATE TABLE trader.weather
(
station text NOT NULL,
"timestamp" timestamp with time zone NOT NULL,
temp numeric(6,2),
wind numeric(6,2)
)

【问题讨论】:

    标签: postgresql csv import


    【解决方案1】:

    不能在PostgreSQL上完成,你应该在postgres之前使用外部工具或进程来完成。

    根据手册,您可以对 CSV 执行的唯一过程大多与 QUOTENULL 相关:

    COPY table_name [ ( column_name [, ...] ) ]
        FROM { 'filename' | STDIN }
        [ [ WITH ]
              [ BINARY ]
              [ OIDS ]
              [ DELIMITER [ AS ] 'delimiter' ]
              [ NULL [ AS ] 'null string' ]
              [ CSV [ HEADER ]
                    [ QUOTE [ AS ] 'quote' ]
                    [ ESCAPE [ AS ] 'escape' ]
                    [ FORCE NOT NULL column_name [, ...] ] ] ]
    
    COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
        TO { 'filename' | STDOUT }
        [ [ WITH ]
              [ BINARY ]
              [ OIDS ]
              [ DELIMITER [ AS ] 'delimiter' ]
              [ NULL [ AS ] 'null string' ]
              [ CSV [ HEADER ]
                    [ QUOTE [ AS ] 'quote' ]
                    [ ESCAPE [ AS ] 'escape' ]
                    [ FORCE QUOTE { column_name [, ...] | * } ] ] ]
    

    在 PostgreSQL 中使用 CSV 之前,有很多方法可以自动更改它,您应该检查其他选项。

    【讨论】:

      【解决方案2】:

      可以用 Postgres 完成,只是不能直接用 COPY

      使用这样的临时临时表:

      CREATE TEMP TABLE target_tmp AS
      TABLE target_tbl LIMIT 0;  -- create temp table with same columns as target table
      
      COPY target_tmp FROM '/absolute/path/to/file' (FORMAT csv);
      
      INSERT INTO target_tbl
      TABLE  target_tmp 
      OFFSET 8;  -- start with line 9
      
      DROP TABLE target_tmp; -- optional, else it's dropped at end of session automatically
      

      跳过的行也必须有效。

      显然,这更昂贵 - 这对于中小型桌子应该没有多大关系。与大桌子有关。那么你真的应该在导入之前修剪输入文件中的多余行。

      确保您的 temp_buffers 设置足够大以容纳临时表,以最大限度地减少性能损失。

      相关(包含\copy 没有超级用户权限的说明):

      【讨论】:

      • 我在问题中添加了一些关于我的数据集的详细信息。谢谢。
      • 我也收到错误:必须是超级用户才能复制到文件或从文件中复制
      • @otterdog2000:您可以使用 psql 元命令\copy。我在链接的答案中添加了详细说明。
      • 当我用 \copy 替换 COPY 时出现此错误............错误:“\”第 4 行或附近的语法错误:\copy weather_temp FROM /D: /Google Drive/Work/Fortress/mesow...
      • @otterdog2000: \copy 是 psql 元命令,而不是 SQL 命令 您不能从 pgAdmin SQL 编辑器运行,只能从 psql(默认交互式终端)运行。链接的答案对此很明确。
      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 2016-12-18
      • 2017-04-11
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多