web-dev-qa-db-ja.com

Postgresコピーで大きなテキストファイルの最初の行を無視する方法

〜9gbというかなり大きな.txtファイルがあり、このtxtファイルをpostgresにロードしたいと思います。最初の行はヘッダーで、その後にすべてのデータが続きます。データを直接PostgreSQLにコピーすると、ヘッダーによってデータタイプが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のデータを読み込む必要がありますヘッダーの最初の行... postgresデータベースにデータをロードできるように、txtファイルの最初の行を簡単に削除する他のソリューションがありますか?

29
thiakx

HEADERオプションとCSVオプションを使用します。

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

HEADERファイルの各列の名前を含むヘッダー行がファイルに含まれることを指定します。出力では、最初の行にテーブルの列名が含まれ、入力では、最初の行は無視されます。このオプションは、CSV形式を使用する場合にのみ許可されます。

52
Edmon