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

时间:2012-08-02 09:29:22

标签: sql postgresql copy

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

示例数据:     专案编号,MailId,MailCodeId,prospectid,listid,datemailed,金额,捐赠,拉链,ZIP4,VectorMajor,VectorMinor,包ID,相位,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数据库中?

1 个答案:

答案 0 :(得分:50)

将HEADER选项与CSV选项一起使用:

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

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