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

Requêtes PostgreSQL Discussion :

import fichier csv


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 92
    Points : 54
    Points
    54
    Par défaut import fichier csv
    bonjour,

    je souhaite importer un fichier csv pour en faire une table. Ce fichier est assez énorme et cela me complique la tache (300 mo, 950000 lignes et +80 colonnes...)


    j'ai executé une requête qui me crée ma table + les 80 colonnes

    mais lorsque je réalise la copy cela bug :

    req sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COPY matable FROM  'c:/monfichier.csv' WITH DELIMITER ';';
    Erreur SQL :
    ERREUR: syntaxe en entrée invalide pour le type real : « 93,8400440899955 »
    CONTEXT: COPY matable, ligne 1, colonne dcntsfdpc : « 93,8400440899955 »

    visiblement ma colonne dcntsfdpc de type réel ne convient pas pour stocker 93,8400440899955 ? Que faut il alors indiquer comme type ? Je découvre postgresql depuis cet aprem et je suis un peu perdu. J'ai cherché désespérément le type float ...mais j'ai pas trouvé. S'il butte dès la première ligne et qu'il stoppe tout je suis pas près d'y arriver .

    merci de votre aide....

  2. #2
    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
    Dans le fichier, pour les colonnes avec des nombres décimaux, il faudrait utiliser le point comme séparateur décimal et non la virgule (norme américaine).

    Pour le choix du type, il y a float4 et float8 pour le stockage avec perte variable de précision, et numeric pour une précision exacte. real est un synonyme de float4, et double ou double precision sont des synonymes de float8. float4 prend 32 bits et float8 64 bits.
    Vu le nombre de chiffres après la virgule dans ton exemple, j'ai l'impression que real ne convient pas à tes données, c'est trop petit.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 92
    Points : 54
    Points
    54
    Par défaut
    merci pour la réponse.
    Je viens de tester et l'erreur rencontrée provenait bien d'un mauvais séparateur décimal : j'ai donc mis un point au lieu d'une virgule (soit environ 2000000 de remplacements pour mon fichier ).

    Je rencontre maintenant un autre souci : j'ai encore des champs de type réel ou entier qui posent problèmes lors de la copie lorsque le champ de la ligne est vide (il n'y a rien entre les séparateurs ;.
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERREUR:  syntaxe en entrée invalide pour le type real : «  »
    CONTEXT:  matable, ligne 6, colonne t_xref : «  »
    Faut il ajouter une instruction à ma requête pour contourner le problème? Je souhaiterai éviter de changer le type de champ ...

    autre remarque : je suis surpris qu'il n'insère pas les lignes où il n'a pas rencontré d'erreurs (dans mon cas les 5 premières...)

  4. #4
    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 ajouter une instruction à ma requête pour contourner le problème? Je souhaiterai éviter de changer le type de champ ...
    En mode CSV, un champ vide est pris comme NULL (c'est le comportement par défaut, changeable dans la commande COPY) donc si le champ était vide, ça passerait.
    Mais là d'après le message d'erreur, le champ n'est pas vide, il contient deux espaces.

    autre remarque : je suis surpris qu'il n'insère pas les lignes où il n'a pas rencontré d'erreurs (dans mon cas les 5 premières...)
    C'est le comportement normal. Mais si COPY est trop simplet pour ton besoin, tu peux peut-être voir du côté de pgloader, un programme d'insertion de données en masse qui offre plus d'options.

Discussions similaires

  1. Import fichier CSV
    Par oki972 dans le forum SQLite
    Réponses: 5
    Dernier message: 08/10/2007, 20h58
  2. [Pb Importation fichier CSV]
    Par Jeremie_Vi dans le forum Access
    Réponses: 2
    Dernier message: 04/05/2007, 06h54
  3. Importation fichier CSV Excel
    Par @lex(is) dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 22/06/2006, 02h16
  4. Update de plusieurs tables, import fichier csv sql loader
    Par fusuke dans le forum SQL*Loader
    Réponses: 2
    Dernier message: 18/05/2006, 15h08
  5. Réponses: 9
    Dernier message: 31/01/2006, 22h42

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