IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 PostgreSQL Discussion :

Fonction COPY : erreur 22P04, données manquantes [9.1]


Sujet :

PostgreSQL

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Fonction COPY : erreur 22P04, données manquantes
    Bonjour,

    Je débute... j'ai 1 an de recul sur la géomatique (BDD + SIG dans le domaine de l'environnement) mais que quelques jours sur postgre!
    Je travaille sur une base existante dans laquelle je veux mettre de nouvelles données issues d'un csv :
    Je crée ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE essai
    (
    champ1text,
    champ2 text,
    champ3 text,
    champ4 text, 
    champ5 text
    )
    ;
    set client_encoding = 'Latin1';
    Copy essai
    from 'D\[monchemin]\FI_oiseau.txt'
    with delimiter E'\t'
    null ''
    Pour infos : le champ 1 est toujours renseigné, les champs 2, 3, 4, 5 le sont parfois, parfois pas. Dans le txt un champ non renseigné est vide. Je pensais que Postgre allait ne rien mettre dedans au moment de l'import.
    Dans la première donnée du txt, alors que le champ1 et 2 sont renseignés, le champ 3 ne l'est pas, le 4 non plus, j'ai un message d'erreur :

    ERREUR: données manquantes pour la colonne «champ4 »
    CONTEXT: COPY essai, ligne 1 : «.....»

    ********** Erreur **********


    État SQL :22P04
    Pourquoi s'attaquer au champ4 alors que le 3 est vide aussi? J'ai essayé d'ajouter un "defaul 'NR'"; sans résultat satisfaisant.

    Je ne pense pas que ce soit trop grand chose de grave... mais n'ai aucune idée de comment agir?... Merci pour l'aide que vous pourrez m'apporter !
    bonne journée
    A.

  2. #2
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Pouvez-vous donner un échantillon de votre fichier csv s'il vous plaît ?

    Cordialement,

    Arkhena
    A bove ante, ab asino retro, a stulto undique caveto

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour
    ok, du coup, je vous joins un .zip :
    un fichier txt avec quelques lignes (observations naturalistes) : à intégrer dans table "essai"
    le rq.sql.essai2.sql, requête modifiée(pas de moi à l'origine)--> celle sur laquelle je bosse en guise d'essai
    et ORIGINE.sql, requête complète d'origine (avec suppression de l'ancienne table et un certain nombre de lignes en haut et en bas (dont je ne connais pas trop la signification, si ce n'est qu'il y a la suppression de l'ancienne table, l'ajout à la bdd nommée bd38, l'ajout des colonnes de géométrie...)

    Bref, peut être qu'avec au moins le txt et le rq.sql. essai2.sql vous arriverez à trouver où je cloche. Merci beaucoup par avance!
    A.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour,
    le fichier texte est mal construit par exemple
    ligne 1 colonne 8 ( à priori l’espèce) on a bien l’espèce mais pour les autres lignes elles sont vides , l’Espèce se trouve en colonne 9 qui est une colonne de type integer
    il faudrait voir comment est généré ce fichier pour y apporter des corrections

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    oh oui, pardon, dans la manip, j'ai dû généré une erreur, voici un nouveau txt, corrigé depuis libreoffice.
    Merci !
    A.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Un champ vide se matérialise par la présence du seul séparateur (ici une tabulation) pour passer au champ suivant.

    Quand il n'y a aucun séparateur et qu'on n'est pas au tout dernier champ prévu par le format de la table, c'est une erreur. Je crois que c'est ce qui se passe ici.

    Il faudrait que la procédure de génération du fichier de données aille jusqu'au bout de toutes les colonnes, qu'il y ait du contenu ou pas dans les dernières colonnes.

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Merci pour cette réponse, je pense comprendre !
    Le fichier .txt est issus d'un .csv lui même issu d'un .ods de libre office (qui ne permet pas d'enregistrer directement en .txt).
    Comment faire pour qu'un champ vide ne génère pas une erreur en restant juste "tabulation"?
    Je peux éventuellement mettre "NR" dans tous les champs vides ... est-ce une solution (sql-ement correcte)? Sachant que ma table contient 700 000 enregistrements.
    Comment faire si je voulais laisser des champs vides? est-ce seulement possible?
    Merci beaucoup !
    A.

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour,
    A tester
    dans le fichier csv
    sur la première ligne il faut que le dernier champs soit renseigné, mettez éventuellement une valeur bidon
    et dans la commande copy rajouter l'option

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Je penserais plutôt à une résolution du problème en amont.

    Si je prends LibreOffice 3 (livré avec Ubuntu12), je fais une ligne avec 3 colonnes A,B,C et une seconde ligne avec 1 seule colonne qui vaut 1.

    Je sauve en format 'Text CSV' avec 'Save As' et ça me sort un fichier qui a ce contenu (vu avec od -c):
    0000000   A  \t   B  \t   C  \n   1  \t  \t  \n
    0000012
    
    Les '\t' sont les tabulations, on voit qu'après le 1 il y a 2 tabulations qui se suivent qui correspondent aux champs vides.

    Et ça s'importe direct dans psql:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table test(a int,b text,c text);
     
    \copy test from 'test.csv' csv header delimiter E'\t' null ''
     
    select * from test;
     a | b | c 
    ---+---+---
     1 |   | 
    (1 row)
    Ton fichier est nettement plus complexe que cet exemple, mais dans le principe je ne vois pas ce qui gène.

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    C'est mon premier joujou avec pgsql...
    Questions (vos réponses en génèrent ... désolée) : faut-il que dans le csv, les noms de champ apparaissent? dans le modèle de csv de estofilo, il y sont.
    Ya t il une raison au txt plutôt que csv?
    A quoi sert le NULL'' dans la commande COPY?
    A quoi sert le "\" avant de Copy d'estofilo? qu'est ce que od-c, une moyen de visualiser les retour à la ligne et les tab sous forme de \n et \t?

    La problème avec mon fichier c'est que quand je lance la requête il me dit :
    ERREUR: données manquantes pour la colonne « pr_caus »
    CONTEXT: COPY essai, ligne 2 : « FI OISEAU O 461788 1 1500 Oiseau indéterminé Aves sp. 1 25/08/2012 25 8 2012 238 48 24 00:00 0 0 0... »
    ********** Erreur **********
    État SQL :22P04


    J'ai remplacé toutes les cellules vides en NR (via recherche-remplace sur les colonnes concernées cf fichier joint) et l'erreur est toujours la même... par contre avant l'erreur était à la ligne 1, et là c'est à la deux !
    je pense y arriver grâce à vos pistes successives!
    Merci en tout cas!
    A.
    Fichiers attachés Fichiers attachés

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    faut-il que dans le csv, les noms de champ apparaissent
    Non, pas nécessairement. Si la 1ere ligne contient les noms des champs, on met la clause HEADER dans la commande COPY, sinon on ne le met pas.

    Ya t il une raison au txt plutôt que csv?
    CSV est une variante du format texte disant qu'il y a des champs et des séparateurs, txt est tellement vague que je ne sais pas très bien ce que ça désigne, si ce n'est que ça s'oppose aux formats binaires illisibles dans un éditeur de texte (xls, doc, etc.)

    A quoi sert le NULL'' dans la commande COPY?
    Ca indique que les champs vides devront être stockées avec un NULL et non pas une chaine vide. Traditionnellement en SQL on préfère avoir NULL pour un champ non renseigné. En CSV c'est le cas par défaut mais voir la doc pour plus de détails.

    A quoi sert le "\" avant de Copy d'estofilo?
    Avec \copy c'est psql (=le client) qui va ouvrir le fichier et le transmettre au serveur via la connexion alors qu'avec COPY c'est le serveur qui va ouvrir le fichier.

    qu'est ce que od-c, une moyen de visualiser les retour à la ligne et les tab sous forme de \n et \
    C'est une commande unix: http://linux.die.net/man/1/od
    Le but est effectivement de montrer les caractères invisibles sous une forme visible.

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Merci pour ces précieux ajouts :
    Si je comprends bien, a partir d'un csv ou d’un txt contenant juste des tabulations dans les cellules censées être vides, ça devait marcher.
    Mais avec des cellules vides (juste une tabulation) ou avec NR, le message "données manquantes pour la colonne "pr_caus" " revient.
    attend-il obligatoirement une info dans cette cellules, qu'ai je pu faire pour provoquer cela ?
    Les fichiers joints précédemment sont-ils suffisants pour que vous puissiez essayer de votre côté?
    Merci beaucoup !
    A.

  13. #13
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour,
    estofilo vous a donné la solution
    gardez (ou rajouter ) la ligne avec les intitulés des champs, supprimez tous les NR (inutiles) lancez la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copy  essai  from 'd:/FI_oiseau.txt' with csv header delimiter E'\t'  null '';
    PS: il y a juste une erreur dans la ligne 3 le champs integer n_voix contient « Axe de Bièvre »

  14. #14
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    EXCELLENTISSIME ... ça marche du feu de dieu !
    génial, merci infiniment
    A bientôt (ça motive vraiment, continuer, persévérer, galérer, y arriver!!)
    A.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Fonctions base de données manquantes (BDMEDIANE, BDMODE, BDCENTILE, etc.)
    Par tosole dans le forum Contribuez
    Réponses: 0
    Dernier message: 08/10/2012, 18h10
  2. Copie base de données - Erreur d'exécution
    Par lynal dans le forum Administration
    Réponses: 16
    Dernier message: 13/02/2012, 11h22
  3. Erreur de la fonction Copy, dans la bibliotheque ipp
    Par MPEG4 dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 24/07/2009, 18h23
  4. Fonction Copy() - Message d'Erreur permission Denied
    Par clementh dans le forum Langage
    Réponses: 4
    Dernier message: 01/05/2009, 18h25
  5. Erreur: Fonction Copy
    Par bchass dans le forum Langage
    Réponses: 4
    Dernier message: 11/03/2007, 17h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo