将选定的列从csv文件复制到postgres表中

时间:2014-10-13 19:19:17

标签: postgresql copy

在postgres中 - 我目前创建一个表并从csv文件中复制数据(下面我在postgres中创建了确切的表,它对应于我的csv文件表 - 所以列数相同) - 如下所示:

CREATE TABLE SupEnh_AGK50kb_K27ac (
    EnhancerID_AGK50kb_K27ac character(80) NOT NULL,
    Status_AGK50kb_K27ac character(15) NOT NULL,
    Enrich_D_AGK50kb_K27ac float,
    Enrich_R_AGK50kb_K27ac float,
    Enrich_LR_AGK50kb_K27ac float,
    Span_D_AGK50kb_K27ac float,
    Span_R_AGK50kb_K27ac float,
    Span_LR_AGK50kb_K27ac float,
    Multiplication_D_AGK50kb_K27ac float,
    Multiplication_R_AGK50kb_K27ac float,
    Multiplication_LR_AGK50kb_K27ac float,
    NumPeaks_D_AGK50kb_K27ac float,
    NumPeaks_R_AGK50kb_K27ac float,
    NumPeaks_LR_AGK50kb_K27ac float,
    PVal_D_AGK50kb_K27ac float,
    PVal_R_AGK50kb_K27ac float,
    Pval_lr_AGK50kb_K27ac float,

    CONSTRAINT AGK50kb_27ac_Key PRIMARY KEY (EnhancerID_AGK50kb_K27ac)
);

COPY SupEnh_AGK50kb_K27ac 
FROM 'G:\CarrollLab\EnhancerAnalysis\AGK_K27ac.KeyFile'
WITH (FORMAT 'csv', DELIMITER E'\t', NULL 'NULL',HEADER);

这个过程就像一个魅力,但我想略微修改它,所以我能够先创建一个小版本的postgres表 - 一个只保留前5列。 然后我想直接从我的csv文件中加载前5列。 有没有办法稍微改变我在这里提供的代码,以便它允许我做我之后的事情(并且不使用将在postgres上创建并将保留所有列的临时表)? 非常感谢, 罗伊

1 个答案:

答案 0 :(得分:1)

您可以使用file_fdw外部数据包装器来访问CSV文件,这样您就可以使用SELECT INTO直接从CSV文件查询到表中。然后,您可以准确指定要保留的列。

示例:假设我有这个文本文件:

1,"apple","banana"
2,"pear","orange"

我只想在表格中包含前两列:

-- Do this once only per database, to create the extension and define the fdw server
CREATE EXTENSION file_fdw;
CREATE SERVER csvfile FOREIGN DATA WRAPPER file_fdw;

-- File must be accessible to the backend
-- All columns existing in the file must be present in the FDW table definition
CREATE FOREIGN TABLE mycsv(a integer, b text, c text)
    SERVER csvfile OPTIONS ( filename '/tmp/test.csv', format 'csv');

-- Now we can copy into our actual table
-- ignoring column c
SELECT a,b INTO testtable FROM mycsv;

使用SELECT INTO为您创建新表。另一种方法是事先创建表并使用INSERT INTO {table} SELECT {query}