39

我有一个相当大的 .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 函数具有可以忽略第一行的“header”设置,但它仅适用于 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 数据库中?

4

2 回答 2

71

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

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

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

于 2012-08-03T02:23:50.953 回答
0

我在https://www.postgresql.org/docs/10/sql-copy.html
上查找了 有关 HEADER 的文档,这不仅适用于 CSV,而且适用于 TSV!

我的解决方案是在 psql

\COPY mytable FROM 'mydata.tsv' DELIMITER E'\t' CSV HEADER;

(in addition mydata.tsv contaned header row which I excluded from copying to database table)

于 2022-01-14T16:59:51.727 回答