Extraire des colonnes d'un fichier .txt

sekkeith Messages postés 8 Statut Membre -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, je suis novice dans la programmation Perl mais j'ai téléchargé des tutos et cours que je bosse. En effet je suis bloqué par un programme que je dois écrire me permettant d'extraire des colonnes d'un fichier .txt et ensuite de les mettre les unes à la suite des autres dans une seule colonne.
Merci de vouloir m'accorder un bout de votre temps.

5 réponses

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut sekkeith,

    Montre nous :

    - ton jeu de données de départ
    - le résultat attendu par rapport à ce jeu de données
    - ce qui te pose exactement problème dans le code que tu as déjà commencé à faire

    Dal
    0
  2. sekkeith Messages postés 8 Statut Membre
     
    Merci d'avoir répondu.
    Mon jeu de données se présente :
    "\t" DL LU TW MO
    Csf x1 y1 z1 t1
    Ind x2 y2 z2 t2
    Tran x3 y3 z3 t3
    other x4 y4 z4 t4

    separées par des "\t"
    format de sortie
    Csf DL x1
    Ind DL x2
    Tran DL x3
    other DL x4
    Csf LU y1
    Ind LU y2
    Tran LU y3
    other LU y4
    Csf TW z1
    Ind TW z2
    Tran TW z3
    other TW z4
    Csf MO t1
    Ind MO t2
    Tran MO t3
    other MO t4

    Ainsi de suite c'est un bout, il y'a plus de lignes et plus de colonnes.
    Merci encore.
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      - ce qui te pose exactement problème dans le code que tu as déjà commencé à faire

      Où es ton code problématique dans ce que tu as déjà commencé à faire ?


      Dal
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      si tu sors les lignes, cela sera plus facile, est-ce qu'une sortie comme ceci irait aussi :
      Csf	DL	x1 
      Csf LU y1
      Csf TW z1
      Csf MO t1
      Ind DL x2
      Ind LU y2

      etc.

      Dal

      NB : quand tu postes, utilise les balises de code (symbole <> à droite des boutons de l'éditeur pour des données formatées, et clique sur la flèche pointant vers le bas pour un formatage de code source dans un langage donné)
      0
  3. sekkeith Messages postés 8 Statut Membre
     
    Merci pour ton attention
    Peux tu me faire voir le code qui donne la structure que tu me presente?
    Merci!
    Voici ce que j'ai tenté d'ecrire et ça ne m'a rien donné
    #!/usr/bin/perl -w
    use strict;
    use warnings;

    open(FILE, "iea_ci_1990.txt") || die "Erreur E/S : $!\n";
    my @contenu = <FILE>;
    close(FILE);

    open(FILE, ">fichier2.txt") || die "Erreur E/S : $!\n";
    foreach (@contenu) {
    my @datas = split(/\t/, $_);
    for (my $n=1; $n==11;$n+=1){
    print FILE "$datas[0] $datas[$n]\n";
    }
    }
    close(FILE);
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      tu n'as pas mis ton code à l'intérieur de la balise code, du coup ton code n'est pas formaté.

      sinon, tu dis que tu apprends Perl par tes propres moyens et que tu fais cet exercice dans le cadre de ton apprentissage... si j'écris le code à ta place, tu ne fais pas l'exercice... veux-tu vraiment que j'écrive ce code ?

      avant d'écrire quoi que ce soit, pour tes données de départ, il y a un truc bizarre sur la première ligne où tu mets "\t" ... est-ce que ces caractères sont vraiment dans ta première ligne, ou est-ce que tu veux dire que la première ligne commence par une tabulation ?

      en d'autres termes, tes données de départ sont du type :

          DL  LU  TW  MO
      Csf x1 y1 z1 t1
      Ind x2 y2 z2 t2
      Tra x3 y3 z3 t3
      oth x4 y4 z4 t4

      ou alors comme tu l'écrivais :

      "\t" DL LU TW MO
      Csf x1 y1 z1 t1
      Ind x2 y2 z2 t2
      Tra x3 y3 z3 t3
      oth x4 y4 z4 t4

      (note : il y a bien une tabulation séparant chaque colonne dans les deux cas ci-dessus)

      Par ailleurs, tu n'as pas répondu à cette question sur le format de sortie : https://forums.commentcamarche.net/forum/affich-31749092-extraire-des-colonnes-d-un-fichier-txt#4

      Dal
      0
    2. sekkeith Messages postés 8 Statut Membre > [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Bonsoir effectivement "\t" pour dire qu'il y a un espace
      Bon vraiment si j'ai le code ça me permettra d'avancer un peu.
      <#!/usr/bin/perl -w
      use strict;
      use warnings;

      open(FILE, "iea_ci_1990.txt") || die "Erreur E/S : $!\n";
      my @contenu = <FILE>;
      close(FILE);

      open(FILE, ">fichier2.txt") || die "Erreur E/S : $!\n";
      foreach (@contenu) {
      my @datas = split(/\t/, $_);
      for (my $n=1; $n==11;$n+=1){
      print FILE "$datas[0] $datas[$n]\n";
      }
      }
      close(FILE);

      ></code>
      0
    3. sekkeith Messages postés 8 Statut Membre > sekkeith Messages postés 8 Statut Membre
       
      Je ne réussis toujours pas à l'écrire comme tu le dis.
      0
    4. sekkeith Messages postés 8 Statut Membre > [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Bonjour
      le format que tu proposes est bon je le réarrangerai après:
      Csf DL x1
      Csf LU y1
      Csf TW z1
      Csf MO t1
      Ind DL x2
      Ind LU y2
      merci !
      0
  4. sekkeith Messages postés 8 Statut Membre
     
    OK merci pour le code il marche super bien bien.Eexcuse moi j'étais en déplacement, donc pas de connexion.
    Peux tu m'expliquer un peu cette séquence:
    ($line =~ /([^\t]+)\t(.*)/)
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      cette ligne signifie :

      - teste le contenu de
      $line
      selon l'expression rationnelle qui suit
      - les parenthèses opèrent une capture de ce qui matche le contenu de la parenthèse
      - la première parenthèse matche, à partir du début de la ligne, un ou plusieurs caractères qui ne sont pas des tabulations :
      [^\t]+
      (les crochets permettent d'établir une classe de caractères, dans ce contexte le
      ^
      est une négation, le
      +
      est le quantificateur "un ou plusieurs")
      - puis la regexp matche une tabulation
      - puis la deuxième parenthèse matche tout ce qui est à la suite sur cette ligne, quel qu'en soit le contenu :
      .*
      (le point signifie n'importe quel caractère et l'étoile
      *
      est le quantificateur "0 ou plus")

      la première capture est rangée par Perl dans
      $1
      et la deuxième dans
      $2
      .

      comme la regexp est évaluée dans le contexte d'un test, elle sert non seulement à capturer les données, mais aussi à vérifier que le format de cette ligne correspond au format attendu

      chouette, non ?

      Dal
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question