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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使Postgres Copy忽略大文本文件的第一行相关的知识,希望对你有一定的参考价值。

我有一个相当大的.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数据库中?

答案

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

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

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

以上是关于如何使Postgres Copy忽略大文本文件的第一行的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 postgres 中的存储函数压缩 CSV 文件

在 postgres 上将表导出到 csv

Postgres copy命令导入导出数据

如何在 9.414 版本中使用 executemany 忽略 postgres 中的重复项?

如何对具有纪元值的列进行 JOIN 查询,忽略 postgres 中的时间部分

如何使用 psql \copy 元命令忽略错误