Forum Programmation.perl Lire un fichier et le découper

Posté par  .
Étiquettes : aucune
0
11
mai
2010
Bonjour,

Je débute en PERL et je voudrais lire un fichier qui contient n lignes et m valeurs sur chaque lignes.

Je le fais de la façon suivante:


#! /bin/bash

while IFS=: read CeldaActiva Numcelda Lat Lon binfilt Ds

do
echo -e "CeldaActiva :\t $CeldaActiva\n\
Numcelda :\t Numcelda\n\
Lat :\t $Lat\n\
Lon :\t $Lon\n\
binfilt :\t $binfilt\n\
Ds :\t $Ds\n\
done < soil_GRIJ_ldas125.corr.corr


Mon fichier est ainsi (celui que je lis):

1 1 14.9375 -91.4375 0.01 0.0545455
1 2 14.9375 -91.5625 0.01 0.0467


Mais mon code ne reconnait pas les espaces, au moment de l'exécuter il me met toutes les valeurs de la première ligne dans la première valeur donnée:


CeldaActiva : 1 1 14.9375 -91.4375 0.01 0.0545455
Numcelda :
Lat :
Lon :
binfilt :
Ds :


Je ne comprends pas pourquoi pourtant ce sont bien des espaces de séparation dans le fichier que je lis et dans les espaces que je donne à la variable au moment de séparer.

Merci de votre aide.
  • # Un peu HS

    Posté par  . Évalué à 1.

    Juste pour info, ce n'est pas du perl mais du bash. Tu es hors sujet.

    Je ne comprends pas le IFS=:. Cela change la valeurs du séparateur de champ de l'espace vers :. Tes champs dans ton fichiers sont séparés par des espaces et pas des :, il ne le voit que comme un champ.


    $ echo "1 2 3" > toto
    $ while read ONE TWO TREE; do echo $ONE; echo $TWO; echo $TREE; done < toto
    1
    2
    3
    • [^] # Re: Un peu HS

      Posté par  . Évalué à 1.

      Désolée, je pensais que c'était du PERL...
      le IFS en fait j'ai pris cet exemple, je voulais faire quelque chose d'identique et je ne comprends pas pourquoi ça ne fonctionne pas...

      http://www.commentcamarche.net/faq/5027-comment-lire-un-fich(...)

      Il vous est tout a fait possible à partir d'un fichier structuré (comme un carnet d'adresse ou /etc/passwd par exemple), de récupérer les valeurs de chaque champ et de les affecter à plusieurs variables avec la commande "read". Attention toutefois de bien assigner à la variable "IFS" le bon séparateur de champ (espace par défaut).

      Exemple :

      #! /bin/bash

      while IFS=: read user pass uid gid full home shell
      do
      echo -e "$full :\n\
      Pseudo : $user\n\
      UID :\t $uid\n\
      GID :\t $gid\n\
      Home :\t $home\n\
      Shell :\t $shell\n\n"
      done < /etc/passwd
      • [^] # Re: Un peu HS

        Posté par  (site web personnel) . Évalué à 2.

        Attention toutefois de bien assigner à la variable "IFS" le bon séparateur de champ (espace par défaut).


        while IFS=: read user pass uid gid full home shell
        do
        echo -e "$full :\n\
        Pseudo : $user\n\
        UID :\t $uid\n\
        GID :\t $gid\n\
        Home :\t $home\n\
        Shell :\t $shell\n\n"
        done < /etc/passwd


        cat /etc/passwd | grep guest
        guest:*:200:0::/home/guest:/usr/bin/sh



        Tu comprends pourquoi ton code ne marche pas ?
    • [^] # Re: Un peu HS

      Posté par  . Évalué à 0.

      Désolée, je pensais que c'était du PERL...
      le IFS en fait j'ai pris cet exemple, je voulais faire quelque chose d'identique et je ne comprends pas pourquoi ça ne fonctionne pas...

      http://www.commentcamarche.net/faq/5027-comment-lire-un-fich(...)

      Il vous est tout a fait possible à partir d'un fichier structuré (comme un carnet d'adresse ou /etc/passwd par exemple), de récupérer les valeurs de chaque champ et de les affecter à plusieurs variables avec la commande "read". Attention toutefois de bien assigner à la variable "IFS" le bon séparateur de champ (espace par défaut).

      Exemple :

      #! /bin/bash

      while IFS=: read user pass uid gid full home shell
      do
      echo -e "$full :\n\
      Pseudo : $user\n\
      UID :\t $uid\n\
      GID :\t $gid\n\
      Home :\t $home\n\
      Shell :\t $shell\n\n"
      done < /etc/passwd
  • # Sans les mains !

    Posté par  (site web personnel) . Évalué à 3.

    #! /bin/env perl -w

    use strict;

    open(FH,"<soil_GRIJ_ldas125.corr.corr");
    while(){
    # Supprime le \n à la fin de la ligne
    chomp; # Supprime le \n à la fin de la ligne

    # Coupe aux espaces, et stocke chaque morceau
    my ($CeldaActiva, $Numcelda, $Lat, $Lon, $binfilt, $Ds) = split /\s+/;

    # Affiche
    print "CeldaActiva:\t$CeldaActiva\n";
    print "Numcelda:\t$Numcelda\n";
    print "Lat:\t\t$Lat\n";
    print "Lon:\t\t$Lon\n";
    print "binfilt:\t$binfilt\n";
    print "Ds:\t\t$Ds\n\n";
    }

    close FH;
    • [^] # Re: Sans les mains !

      Posté par  . Évalué à 1.

      Merci pour ta réponse, mais j'ai essayé et ça ne fonctionne pas, je n'ai plus de valeurs dans mon fichier de sortie même pas la ligne entiere...

Suivre le flux des commentaires

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