在PostgreSQL中使用复制命令时跳过CSV中的第一列数据

pbpqsu0x  于 2023-09-28  发布在  PostgreSQL
关注(0)|答案(2)|浏览(174)

我有一个没有标题的管道分隔数据文件。我需要导入数据到一个PostgreSQL表中的数据从第二列的文件即跳过数据之前的第一个'|’的每一行。如何使用COPY命令实现此目的?

camsedfj

camsedfj1#

使用“剪切”命令删除第一列,然后导入。

cut -d "|" -f 2- file1.csv > file2.csv
psql -d test -h localhost -c "\copy table(f1,f2,f3) from 'file2.csv' delimiter '|' csv header;"

不是一个与postgresql相关的答案,而是更多关于命令行工具。

dced5bon

dced5bon2#

我最近遇到了类似的问题。我用下面的代码解决了这个问题:

begin;
-- create temporary table, its columns NEED to match source file
-- you can also specify all columns manually, they just need to match file.
create temporary table tmp_table as select * from source_table where false;

-- either from file 
copy tmp_table ('list of columns IN THE FILE' ) from '/data/table.csv' WITH (FORMAT csv, HEADER false);

-- or from gzip 
copy tmp_table ('list of columns IN THE FILE' ) from program 'zcat /data/table.csv.gz' WITH (FORMAT csv, HEADER false);

-- you can add, drop, compute additional columns if needed
alter table tmp_table ADD COLUMN IF NOT EXISTS new_column date default NULL;

insert into source_table (columns, in, the, target, table) select columns, in, the, temp, table from tmp_table where optional=conditions on conflict  do nothing ;
drop table if exists tmp_table;
commit;

这将创建一个临时表,其中的列需要与文件中的列相匹配。然后将数据加载到该表中。一旦你在数据库中有了数据,你就可以随心所欲地改变它们。
这种方法允许您修改数据、重新排列列以及添加或删除它们。你也可以使用db-do id查找表中的其他表来转换数据。您还可以使用on conflict cause处理冲突。请注意,根据您创建临时表的方式,一旦发出提交/回滚,它就可以被删除。

相关问题