如何使Postgres Copy忽略大文本文件的第一行

问题描述 投票:28回答:1

我有一个相当大的.txt文件~9gb,我想将这个txt文件加载到postgres中。第一行是标题,后跟所有数据。如果我postgres直接复制数据,标题将导致数据类型与我的postgres表不匹配的错误,所以我需要以某种方式删除它。

示例数据:ProjectId,MailId,MailCodeId,prospectid,listid,datemailed,amount,donated,zip,zip4,VectorMajor,VectorMinor,packageid,phase,databaseid,amount2

15,53568419,89734,219906,15,2011-05-11 00:00:00,0,0,90720,2915,NonProfit,POLICY,230,3,1,0

16,84141863,87936,164657,243,2011-03-10 00:00:00,0,0,48362,2523,NonProfit,POLICY,1507,5,1,0

16,81442028,86632,15181625,243,2011-01-19 00:00:00,0,0,11501,2115,NonProfit,POLICY,1508,2,1,0

虽然postgres的COPY函数具有可以忽略第一行的“标题”设置,但它仅适用于csv文件:

copy training from 'C:/testCSV.csv' DELIMITER ',' csv header;

当我尝试在我的txt文件上运行上面的代码时,它会收到一个错误:

copy training from 'C:/testTXTFile.txt' DELIMITER ',' csv header
ERROR:  unquoted newline found in data
HINT:  Use quoted CSV field to represent newline.

我尝试添加“quote”和“escape”属性,但命令似乎不适用于txt文件:

copy training from 'C:/testTXTFile.txt' DELIMITER ',' csv header quote as E'"'  escape as E'\\N';
ERROR:  COPY escape must be a single one-byte character

或者,我考虑运行java或创建一个单独的停滞表来删除第一行...但这些解决方案是广泛和耗时的。我将需要加载9gb的数据只是为了删除第一行标题...是否有其他解决方案可以轻松删除txt文件的第一行,以便我可以将数据加载到我的postgres数据库中?

sql postgresql copy
1个回答
50
投票

使用带有CSV选项的HEADER选项:

\copy <table_name>  from '/source_file.csv' delimiter ',' CSV HEADER ;

HEADER指定文件包含标题行,其中包含文件中每列的名称。在输出时,第一行包含表中的列名,在输入时,第一行被忽略。仅在使用CSV格式时才允许此选项。

© www.soinside.com 2019 - 2024. All rights reserved.