web-dev-qa-db-fra.com

Comment faire pour que Postgres Copy ignore la première ligne d'un grand fichier texte

J'ai un fichier .txt assez volumineux ~ 9 Go et j'aimerais charger ce fichier txt dans postgres. La première ligne est l'en-tête, suivie de toutes les données. Si je postgres COPIE les données directement, l'en-tête provoquera une erreur que le type de données ne correspond pas à ma table postgres, donc je devrai les supprimer d'une manière ou d'une autre.

Exemples de données: 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

Alors que la fonction COPY pour postgres a le paramètre "header" qui peut ignorer la première ligne, elle ne fonctionne que pour les fichiers csv:

copy training from 'C:/testCSV.csv' DELIMITER ',' csv header;

lorsque j'essaie d'exécuter le code ci-dessus sur mon fichier txt, il obtient une erreur:

copy training from 'C:/testTXTFile.txt' DELIMITER ',' csv header
ERROR:  unquoted newline found in data
HINT:  Use quoted CSV field to represent newline.

J'ai essayé d'ajouter des attributs "quote" et "escape" mais la commande ne semble pas fonctionner pour le fichier 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

Alternativement, j'ai pensé à exécuter Java ou créer une table échelonnée séparée pour supprimer la première ligne ... mais ces solutions sont vastes et prennent du temps. Je vais devoir charger 9 Go de données juste pour supprimer la première ligne d'en-têtes ... existe-t-il d'autres solutions pour supprimer facilement la première ligne d'un fichier txt afin de pouvoir charger les données dans ma base de données postgres?

29
thiakx

Utilisez l'option HEADER avec l'option CSV:

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

HEADER Spécifie que le fichier contient une ligne d'en-tête avec les noms de chaque colonne du fichier. En sortie, la première ligne contient les noms de colonne de la table et en entrée, la première ligne est ignorée. Cette option n'est autorisée que lors de l'utilisation du format CSV.

52
Edmon