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

Linux Discussion :

Problème traitement gros fichier plat, cut, sed, etc


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut Problème traitement gros fichier plat, cut, sed, etc
    Bonjour,

    Voilà, j'ai un problème sur un script que j'ai écrit. Il doit traiter un fichier de 3Go, et selon mes calculs si je laisse ce que j'ai écrit cela mettra 69 jours à s'exécuter ....
    Le fichier est un fichier plat. Chaque ligne contient des infos mises bout à bout.
    ex :
    info1info2l'info3 info4 info5......
    Je dois insérer ces valeurs dans une requête sql pour obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into (xx,xx,xx,...) VALUES ('info1','info2','l\'info3','info4','info5'....)
    Donc, je traite le fichier ligne par ligne.

    - J'utilise le cut pour séparer les champs.
    - Pour chaque champs je lui demande avec un sed de remplacer les ' par \' (Je ne peux pas le faire pour la ligne entière car je me base sur les positions des caractères pour retrouver les champs)
    - Je supprime également grâce au sed, pour chaque champ, les espaces situés en fin de champ.

    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "INSERT INTO TABLE(xx,xx,xx,xx,xx....) VALUES ('`echo ${ligne} | cut -b 1-14| sed s/\'/\\\\\\\\\'/g | sed s/' '*$/''/g`','`echo ${ligne} | cut -b 15-54| sed s/\'/\\\\\\\\\'/g | sed s/' '*$/''/g`','`echo ${ligne} | cut -b 55-61| sed s/\'/\\\\\\\\\'/g | sed s/' '*$/''/g`','`echo ${ligne} | cut -b 62-67| sed s/\'/\\\\\\\\\'/g | sed s/' '*$/''/g`');" | sed s/\'\'/"null"/g # >> ${FICHIER_REQUETE}
    (en réduit car il y a une centaine de champs au total !)

    Y'aurait-il une solution moins couteuse en temps qui vous viendrait à l'idée ?

    Merci,

    Jérôme

  2. #2
    Membre chevronné Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Par défaut
    Salut,

    Traiter ça avec un programme en Perl ou en C ne serait pas plus rapide ?

    T.

  3. #3
    Membre émérite Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Par défaut
    Hello,

    A priori, script perl.
    J'ai fait un script qui fait sensiblement la même chose que toi sur des fichiers plus petits (ordre de 2Mo), c'est de l'ordre de qq secondes.
    La succession des echo | sed me parait couteuse pour pas grand chose.

    ++

    Rq 1 : 3Go de données, tu va mettre des semaines à faire tes insert tu devrais utilser une syntaxe d'import de masse (COPY en PgSQL)
    Rq2 : un certain nombre de SGBDR sont capable d'utiliser directement le format CSV, quel est ton SGBD ? A moins qu'il n'y ai des traitements specifique à faire sur les champs?

  4. #4
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut
    Merci, mais la commande copy ne prend en entrée, que des fichiers avec délimiteurs.
    Si je le génère, j'aurais toujours à faire les cut, et ça prendra toujours autant de temps, non ?

    Jérôme

  5. #5
    Membre émérite Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Par défaut
    Ca dépend

    quelle est ta base?
    par quel moyen (caractère?) sépare tu tes champs? (par défaut, cut utilise la tabulation, est ce le cas pour toi?).

    Si tu utilise un caratère, la syntaxe pour COPY de Pg :
    COPY tableName [( colonne1 [, colonne2)...]] FROM 'fileName' USING DELIMITERS '\t'.

    En plus, ta commande serait plus efficace avec un awk plutot qu'un cut (un seul passage sur la chaine d'entrée pour faire les séparartions) (en supposant que tu utilise un caractère comme séparateur)

  6. #6
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Par défaut
    et ouais ...... mais non ! Je n'utilise pas de caractère séparateur.
    Mes données sont à la suite les unes des autres, et on les retrouve par leur position dans la ligne ...

  7. #7
    Membre émérite Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Par défaut
    je viens de parcourir un peu plus le man awk, il semble qu'il puisse faire des substr. Ca pourrait peut eutre te servir (plus rapide?)?
    un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat 'fichier.txt' | awk '{c1=substr($1,indicedebut,longueur); c2=substr($1,indicedebut,longueur); ...... print $c1";"$c2";"$c3 ... }' | psql ....
    Il doit y avoir moyen d'applique le sed (pour virer les espaces finaux) dans le awk, voire avant, mais je ne sais pas comment faire.
    A mon avis, tu devrais regarder plus en détail awk.

    ++

    EDIT : correction du print de la commande

Discussions similaires

  1. Problème traitement de fichiers texte
    Par darkbol1982 dans le forum VBScript
    Réponses: 7
    Dernier message: 20/02/2009, 15h05
  2. bdd MySQL ==> gros fichier plat, csv
    Par foubou dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 28/04/2008, 15h47
  3. Problème lecture gros fichier texte
    Par UnnamedBoy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 22/02/2008, 11h13
  4. Traitement gros fichiers
    Par ouiouioui dans le forum Langage
    Réponses: 1
    Dernier message: 18/09/2007, 14h42
  5. générer un fichier xml à partir d'un gros fichier plat
    Par ybennani dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 16/05/2007, 10h47

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