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 RomainT . Évalué à 1.
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 Lnlamexicaine . Évalué à 1.
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 Axioplase ıɥs∀ (site web personnel) . Évalué à 2.
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 Lnlamexicaine . Évalué à 0.
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 Axioplase ıɥs∀ (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 Lnlamexicaine . Évalué à 1.
[^] # Re: Sans les mains !
Posté par RomainT . Évalué à 1.
c'est pas plutôt
while(<FH>){
au lieu de
while(){
?
(saleté de forum qui te vire les < et >)
[^] # Re: Sans les mains !
Posté par Axioplase ıɥs∀ (site web personnel) . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.