Retourner aux forums || Retourner au forum Programmation.perl

Programmation.perl : mettre les données d'un fichier dans un tableau

Posté par modr123 () le 02 mai 2005
0
j'ai fichier du genre A nombre et je souhaite mettre les données dans un tableau
et 0 si A n'est pas présent
comme j'ai vu le précédent message sur le sujet j 'ai essayé d'adapter a mon cas ,mais ça ne marche pas
je débute sous perl et malgré la doc que j'ai lu cet aprés-midi je n'avance pas d'un pouce
deuxième question comment on lit le tableau

--
pour protester contre la dadvsi , je n'achete plus de produit soumis au droit d'auteur ou voisins
> Lire le message (6 commentaires, moyenne: 2,3).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Qui a chanté "comme un ouragan" ?

Posté par Clément varaldi (page perso, ) le 02/05/2005 à 21:07. (lien). Évalué à 3.

Vous pouvez répéter la questioooooooooooon ?

Non sincèrement, je n'ai rien compris.

Heu

Posté par pifou () le 02/05/2005 à 21:56. (lien). Évalué à 3.

Bon alors vu la qualité de ta question, ne t'attends pas à une réponse géniale. Si tu dois juste stocker dans un tableau le contenu d'un fichier (le tableau contient une cellule par ligne du fichier) le plus simple :

$file="/etc/passwd";
# Ouverture du fichier
open(FD, $file)  or die "$file : $!";
# Copie du contenu du fichier dans un tableau
@lines=<FD>;
# Fermeture du fichier
close(FD);
Ensuite pour parcourir le tableau :
# Afficher la taille du tableau
print scalar(@lines)."\n";

#parcours linéaire des lignes du tableau
foreach $line (@lines) {
    # Enlever le retour chariot de fin de ligne
    chomp($line=$line);
    # On coupe la ligne en utilisant comme séparateur ':'
    # équivalent à : @result=split(":", $line);print @result[0]."\n";
    ($user, $passwd, $uid, $gid, $desc, $home, $shell) = split(":", $line);
    print $user."\n";
}
Je te conseille tout de même d'acheter un bouquin sur Perl (par exemple de chez O'Reilly http://www.oreilly.fr/perl.html(...) ) pour commencer et/ou de trouver un tutoriel sur Internet. Si tu bloques déjà sur des choses comme ça tu n'as pas fini de ne pas avancer d'un pouce :).

  • [+] [^]Re: Heu

    Posté par modr123 () le 02/05/2005 à 23:04. (lien). Évalué à -1.

    je n'était pas clair , mais ce l'était pour moi
    j'ai un fichier qui contient des données , pas un tableau
    je souhaite mettre ses données dans un tableau

    my @tableau = ();
    open my $fh, "< /home/guy/lalalalala.txt" or die $@;
    while (<$fh>)
    if(/^(Cr[^,]*),$/) c'est ce truc que je comprends pas , je veux recuperer ce qu'il a apres Cr

    --
    pour protester contre la dadvsi , je n'achete plus de produit soumis au droit d'auteur ou voisins
    • [^]Re: Heu

      Posté par Olivier Macchioni () le 03/05/2005 à 01:08. (lien). Évalué à 2.

      Envoyer un extrait du fichier serait probablement pertinent.

    • [^]Re: Heu

      Posté par pifou () le 03/05/2005 à 08:37. (lien). Évalué à 4.

      Ça serait plus simple si tu nous donnais un exemple de fichier de données, mais comme j'ai un peu de temps (j'ai fini mon script de contrôle de Freevo par gamepad usb plus rapidement que prévu ... merci ruby-sdl) je vais essayer de te donner un maximum d'information pour résoudre ton problème. Alors reprennons depuis le début et en évitant dans un premier temps d'utiliser la variable magique :

      #!/usr/bin/perl 
      # Faisons les choses bien, on va se forcer à bien déclarer nos variables 
      use strict;
      
      # Initialisation du tableau
      my @array=();
      
      # Fichier exemple
      my $file="/etc/passwd";
      # Ouverture du fichier, stockage du descripteur dans la variable $fd
      open(my $fd, $file) or die "$file : $!";
      
      # Parcour linéaire du fichier à l'aide du descripteur
      foreach my $line(<$fd>) {
          # Maintenant on a la ligne courante dans $line
          # On enleve le retour chariot de fin de ligne
          chomp($line);
          print $line."\n";
          # Suivra le traitement pour récupérer les informations pertinentes à stocker dans le tableau
           #[[TRAITEMENT]]
      }
      
      # Fermeture du fichier
      close($fd)
      
      Il nous reste à faire le traitement des lignes de ton fichier, tu as souvent 2 cas qui se présentent :
      1. Les données à récupérer sont séparées par des délimiteurs fixes (comme dans /etc/passwd le ':'), dans ce cas c'est assez facile de récupérer les données en utilisant la fonction split (qui renvoie un tableau):
            my @datas=split(":", $line);
            print $datas[0]."\n"
        
      2. Les données sont assez exotiques, il faut alors souvent passer par les regexp (expressions rationelles/régulières). Dans le cas que tu cites, ça correspond bien au if(/.../). Prennons l'exemple (stupide) de /etc/password où l'on veut stocker dans @array les identifiants des utilisateurs utilisant bash :
            # Si la ligne commence par tout sauf un ':' plusieurs fois (stockage dans $1)
            # puis suivit de n'importe quoi (.*) et finissant ($) par bash
            if($line=~/^([^:]+).*bash$/) {
        	# On ajoute l'utilisateur en question ($1) dans le tableau @array
        	push(@array, $1);
            }
        
      Si tu ne connais pas les regexp un bouquin/tutiriel te sera surement utile.Si on reprends tout notre exemple avec l'utilisation des regexp, on aurait pu aussi réduire la taille du code en utilisant la variable magique ($_) :
      #!/usr/bin/perl 
      # Faisons les choses bien, on va se forcer à bien déclarer nos variables 
      use strict;
      
      # Initialisation du tableau
      my @array=();
      
      # Fichier exemple à stocker dans le tableau
      my $file="/etc/passwd";
      # Ouverture du fichier, stockage du descripteur dans la variable $fd
      open(my $fd, $file) or die "$file : $!";
      
      # Parcour linéaire du fichier à l'aide du descripteur
      while (<$fd>) {
          # Maintenant on a la ligne courante dans $_ (variable magique)
          # On enleve le retour chariot de fin de ligne
          chomp;
          # Si la ligne ($_) commence par tout sauf un ':' plusieurs fois (stockage dans $1)
          # puis suivit de n'importe quoi (.*) et finissant ($) par bash
          if (/^([^:]+).*bash$/) {
      	# On ajoute l'utilisateur en question ($1) dans le tableau @array
      	push(@array, $1);
          }
      }
      
      # Affichage des utilisateurs de bash :
      print "Utilisateurs de bash : ".join(", ", @array)."\n";
      
      # Fermeture du fichier
      close($fd)
      
      Avec ça tu devrais pouvoir avancer un petit peu, enfin je l'espère :).

      • [^]Re: Heu

        Posté par Clément varaldi (page perso, ) le 03/05/2005 à 12:27. (lien). Évalué à 2.

        Si je puis me permettre de patcher ton code, je rajouterai un petit truc :


        < open(my $fd, $file) or die "$file : $!";
        > open(my $fd, "< $file") or die "$file : $!";

        < chomp;
        > chomp;
        > #une ligne de /etc/passwd ressemble à :
        > # titi:x:65534:65534:toto:/home/titi:/bin/sh
        > # on va essayer de récupérer 'titi' mais uniquement si titi utilise bash comme shell...

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.perl