39

かなり大きな .txt ファイル ~9gb があり、この txt ファイルを postgres にロードしたいと考えています。最初の行はヘッダーで、その後にすべてのデータが続きます。データを直接postgres COPYすると、ヘッダーはデータ型が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.

「引用」および「エスケープ」属性を追加しようとしましたが、コマンドは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 ファイルの最初の行を簡単に削除する他のソリューションはありますか?

4

2 に答える 2

71

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

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

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

于 2012-08-03T02:23:50.953 に答える