如何使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忽略大文本文件的第一行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 9.414 版本中使用 executemany 忽略 postgres 中的重复项?