〜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ファイルの最初の行を簡単に削除する他のソリューションがありますか?
HEADERオプションとCSVオプションを使用します。
\copy <table_name> from '/source_file.csv' delimiter ',' CSV HEADER ;
HEADERファイルの各列の名前を含むヘッダー行がファイルに含まれることを指定します。出力では、最初の行にテーブルの列名が含まれ、入力では、最初の行は無視されます。このオプションは、CSV形式を使用する場合にのみ許可されます。