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

Langage Perl Discussion :

Traîtement fichier .txt en PERL


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut Traîtement fichier .txt en PERL
    Bonjour à tous et d'abord merci à ceux qui prendront le temps de me lire et de me répondre.

    J'ai un fichier .txt qui est une extraction de données qui contient tout ce que je veux mais pas comme je le voudrais.
    En gros j'ai 40 colonnes de tableau dont les données sont stockées avec séparateur ";". En revanche je ne sais pour quelle raison, les sauts de lignes ne se sont pas faits à l'identique de l'original. De fait de temps à autre une ligne d'origine va se retrouver en 3 lignes dans le fichier de sortie.

    Ma question serait de savoir dans un premier temps comment "aplatir" le fichier? Comment supprimer les retours/saut de ligne pour que tout soit considéré comme une seule ligne.

    Une fois que j'aurai ça je pensais faire un petit code pour refaire un saut de ligne tous les 40 ";" puisque j'avais 40 colonnes à l'origine.

    J'ai bien entendu utilisé Google : Parser .txt PERL etc... supprimer saut de ligne... etc. Seulement j'ai de vieilles connaissances en prog mais pas en PERL et je suis perdu... et je manque cruellement de temps.
    J'ai aussi tapé les mêmes infos dans la recherche du forum mais je n'ai aps trouvé de réponse ou je ne l'ai pas compris.

    Bref si quelqu'un peut me guider un peu, je dois absolument traiter ce fichier et je n'ai vraiment pas envie de me faire 3000 lignes à la mano!!

    Merci à tous par avance

    P.S. Etape 1 aplatir le fichier, étape 2 re découper

    Edit : Mes plus plates excuses je crois avoir mal posté ma question puisqu'elle apparait en discussion et non pas dans un sous forum...

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Il n'y a pas de problème majeur à supprimer tous les sauts de lignes, et même à considérer que la lecture d'une ligne ne se limite pas au premier retour à la ligne.
    Cependant, pourrais-tu donner un exemple (en pièce jointe ou en lien externe vers un serveur de fichier gratuit) de fichier d'entrée à 40 colonnes en précisant à quelle ligne une cellule du tableau contient des retours à la ligne ? Car je souhaite d'abord savoir s'il existe un autre séparateur de ligne de tableau que le caractère de retour à la ligne (ce qui règlerait immédiatement ton problème, sans avoir à "aplatir" le fichier.

    D'ailleurs, cette information est primordiale, car ton idée d'aplatir le fichier n'est pas bonne en soi : la dernière cellule d'une ligne serait alors concaténée avec la première cellule de la ligne suivante, sans aucune possibilité de les séparer à postériori. Il faudrait donc que tu règles le problème à la source (lors de l'exportation en fichier texte de tes données d'origine).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Par défaut
    Bonjour,
    Juste pour aider un peu j'ai récemment découvert que comme retour ligne il pouvait y avoir le classique "\n" mais aussi le "\r". Cela a résolu un problème proche du tien.
    Tu aura un détail ici http://fr.wikipedia.org/wiki/Fin_de_ligne

    Guillaume

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut
    Bonjour et merci pour vos réponses.

    Pour régler le problème à la source, c'est impossible. Il s'agit d'un prestataire qui a mis des jours à faire l'extraction en DOS... Ayant déjà eu du mal à obtenir le fichier, je ne préfère pas me relancer dans la bataille!

    @philou : Je pensais aplatir le fichier puis créer un petit code qui lis le contenu, à chaque évènement ";" il incrémente une variable, quand la variable arrive à 40, remise à 0 de la variable et insertion du retour à la ligne.

    @guigui32 : merci je vais regarder le lien voir si je peux en tirer quelque chose

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Tu n'as pas compris mon objection rongiermj : en aplatissant totalement le fichier, tu n'arriveras pas à distinguer la première cellule d'une ligne, de la dernière cellule de la ligne précédente, car il n'y aura pas de ; de séparation.
    Pourrais-tu fournir le fichier en question (ou un équivalent s'il contient des données confidentielles) ? Sans cet exemple, il sera difficile de t'apporter une réponse pertinente à ton problème.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Après lecture du fichier que tu m'as fourni en privé, le problème est plus complexe qu'il n'y parait : les retours à la ligne ne se trouvent pas dans les cellules, mais plutôt, un peu n'importe où. Autant les trois premières lignes (séparées par \n\r) ne contiennent effectivement que 40 cellules séparées d'un ; (+ un ; en fin de ligne), autant par la suite, c'est plus chaotique, et la ligne suivante contient bien plus de cellules.
    Cependant, les retours à la lignes semble ne pas être significatifs.

    Pour lire correctement votre fichier, voici une proposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $/ = ";"; # definit le séparateur de ligne à ;
    while (!eof STDIN) {
      # chaque ligne est constituée de 41 cellules séparées par des ;
      # (41 car il semble qu'il y ait un ; à la fin de la dernière cellule d'une ligne)
      push @ligne, [ map { scalar(<STDIN>) } 0 .. 40 ];
    }
    Ceci dit, cela à deux inconvénients :
    - les cellules peuvent contenir des \n. Dans ce cas, on peut les supprimer en modifiant le map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      push @ligne, [  map { (my $cell = <STDIN>) =~ s/[\n\r]//g; $cell } 0 .. 40 ];
    - à partir de la ligne 40 (identifiant 139), il semble qu'il y ait un décalage, et que la ligne précédente possède plus de cellules (42 cellules, donc 43 points-virgules).

    J'ai par ailleurs compté au total 1729 lignes de 40 cellules (donc 70889 points-virgules).

Discussions similaires

  1. modifier une ligne d'un fichier.txt avec perl
    Par amibar dans le forum Langage
    Réponses: 16
    Dernier message: 14/07/2012, 09h56
  2. [PERL]: Help script traitement fichier txt tabulaire
    Par Piccolupo13 dans le forum Langage
    Réponses: 2
    Dernier message: 21/08/2007, 20h37
  3. Tratement d'un fichier .TXT
    Par Blunt dans le forum C++/CLI
    Réponses: 3
    Dernier message: 06/07/2007, 11h19
  4. Réponses: 1
    Dernier message: 05/12/2006, 17h47
  5. [langage]parcours fichier txt en perl sous windows
    Par stef74 dans le forum Langage
    Réponses: 12
    Dernier message: 23/06/2005, 16h39

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