在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上创建并将保留所有列的临时表)? 非常感谢, 罗伊
答案 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}
。