Perl: Extraction de données d'un fichier text

fifto Messages postés 54 Statut Membre -  
trashvip Messages postés 28 Statut Membre -
Hello !

Grâce à vous tous et aux tutoriels sur internet, j'ai réussi à faire tourner sous Unix mes premiers programmes perl.

Il y a cependant quelque chose que je ne parviens pas à faire:

Comment on extrait des données d'un fichier texte ?
Je m'explique:

Voici par exemple mon fichier texte fichier1.txt :

okokokok x y t w a
aaaaa 1 2 3 4 5
45678 2 9 8 4 3

J'aimerais creer À partir de ce fichier un autre fichier texte fichier2.txt qui contiendrait juste les colonnes t et a:

nouveau fichier texte fichier2.txt:

# t a
3 5
8 3

Quelqu'un sait faire ca ? Ou me mettre sur la voie ?
merci.
Miguel

7 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Une autre solution (maintenant je suis en pause).

    #! /usr/bin/perl
    
    use warnings;
    
    @ARGV = qw (/home/lami/fifto.txt);
    open FIC_W,">","/home/lami/fifto_res.txt"
    		or die "Impossible de creer le fichier : $!_n";
    while (<>){
    	s/(.*)/join " ",(split " ", $1)[3,5]/e;
    	print FIC_W $_;
    }


    Le résultat
    [root@localhost ~]# cat /home/lami/fifto.txt
    okokok x y t w a
    aaaaa 1 2 3 4 5
    45678 2 9 8 4 3
    [root@localhost ~]# ls /home/lami/fifto_res.txt
    ls: /home/lami/fifto_res.txt: Aucun fichier ou répertoire de ce type
    [root@localhost ~]# perl ccm_fifto2
    [root@localhost ~]# cat /home/lami/fifto_res.txt
    t a
    3 5
    8 3
    [root@localhost ~]#
    
    2
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    vite fait avant partir au boulot (c'est la grève aujourd'hui)

    [lamitest@localhost corbeille]$ cat ccm_file_fifto
    okokokok x y t w a
    aaaaa 1 2 3 4 5
    45678 2 9 8 4 3
    [lamitest@localhost corbeille]$ perl -pi.orig -e 's/[\w\s]+(\w\s)\w\s(\w\s)/$1$2/g' ccm_file_fifto
    [lamitest@localhost corbeille]$ cat ccm_file_fifto
    t a
    3 5
    8 3
    [lamitest@localhost corbeille]$
    
    1
  3. Yoda
     
    Salut les experts,

    Les bouts de codes ci-dessus me donnent déjà quelques pistes de réflexion, cependant étant totalement novice en programmation . . . J'ai quelques difficultés à les adapter à mon cas . . . :s

    Grosso modo, j'ai quelques milliers de fichiers textes (7300 pour être très précis) et ces .txt contiennent des infos comme présenté ci-après :


    3 PARAMETERS ON 05JAN01.
    1 AZU1 STA X -0.247297943318988E+07 +- 0.241394876950605E-02
    2 AZU1 STA Y -0.467133800760033E+07 +- 0.374164031593362E-02
    3 AZU1 STA Z 0.355810775092403E+07 +- 0.257172727253398E-02
    2 1 0.571958818322482E+00
    3 1 -0.659378461245129E+00
    3 2 -0.847505892381651E+00
    AZU1 ANTENNA LC 0.1636 0.0000 0.0000 !up north east (m)


    Pour traiter ces données, il faudrait que crée un tableau excel, avec les 3 valeurs en gras, situées dans 3 colonnes différentes. Je suis donc au tout début du processus, puisque je compte extraire ces 3 valeurs et les placer dans un fichier texte, pour ensuite créer un .xls.

    Pour extraire ces 3 valeurs, je comptais utiliser grep (comme dans l'exemple de script bash), et je réussis évidemment à extraire mes 3 valeurs, mais sur des lignes différentes . . . Comment faire pour que l'output dans le txt se fasse sur une ligne ?

    Si quelqu'un a une idée . . .
    D'avance merci . . .
    Yoda.
    1
    1. trashvip Messages postés 28 Statut Membre 5
       
      Up up up!!
      Moi aussi je suis intéressé ;)
      Merci d'avance.
      0
  4. philtrain Messages postés 169 Date d'inscription   Statut Membre Dernière intervention   73
     
    Bonjour,
    #!/usr/bin/perl -w
    use strict;
    use warnings;
    
    open(FILE, "fichier1.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(/ /, $_);
        print FILE "$datas[3] $datas[5]\n";
    }
    close(FILE);
    


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

    Posez votre question
  6. philtrain Messages postés 169 Date d'inscription   Statut Membre Dernière intervention   73
     
    la fonction split "éclate" la chaine stockée dans la variable $_ en fonction du délimiteur se trouvant entre les /, donc ici le caractère blanc.
    (voir perldoc -f split)
    Le résultat est stocké dans le tableau @datas

    Pour récupérer les lignes 102 et 105, un simple test sur $datas[0] devrait suffire.

    Philippe
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Si je puis me permettre, puisque tu es sous Unix, avec un simple filtre comme "grep" (ou "egrep") et un "pipe" ( | ) avec "awk" devrait faire l'affaire. En ligne de commande :
    [jp@MDK tmpfs]$ cat file.txt
    okokokok x y t w a
    101 1 2 3 4 5
    102 2 9 8 4 3
    103 5 4 8 7 3
    104 5 9 8 7 6
    105 2 5 7 8 9
    
    [jp@MDK tmpfs]$ egrep "102|105" file.txt | awk '{ print $4" " $6 }'
    8 3
    7 9
    
    Ou dans un script :
    [jp@MDK tmpfs]$ cat batch.sh
    #! /bin/bash
    
    egrep "$1|$2" < file.txt | awk '{ print $4" "$6 }'
    
    [jp@MDK tmpfs]$ sh batch.sh 102 105
    8 3
    7 9
    
    [jp@MDK tmpfs]$
    ;-))
    0
  8. fifto Messages postés 54 Statut Membre
     
    merci Philippe !

    Il y a cependant une ligne que je capte pas:

    my @datas = split(/ /, $_);

    en particulier split(//,$_)

    je dois effectivement comprendre ca car en fait, ce que je dois faire plus précisément c'est ca:

    le fichier fichier1.txt ressemble à ca en fait:

    okokokok x y t w a
    101 1 2 3 4 5
    102 2 9 8 4 3
    103 5 4 8 7 3
    104 5 9 8 7 6
    105 2 5 7 8 9

    Et je dois extraire non seulement les colonnes t a, mais seulement pour les lignes 102 et 105 par exemple.

    le fichier2.txt doit donc etre le suivant au final:

    # t a
    8 3
    7 9
    -1