Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

parcourir ligne

10 réponses
Avatar
climb65
Salut,

j'ai un fichier qui est déjà chargé dans une variable scalaire $file. Je
souhaite y accéder ligne à ligne.
Comment que c'est-y qu'on fait?

10 réponses

Avatar
azrazer
climb65 a écrit :
Salut,

j'ai un fichier qui est déjà chargé dans une variable scalaire $file. Je
souhaite y accéder ligne à ligne.
Comment que c'est-y qu'on fait?



Un fichier déjà chargé dans une variable scalaire...
Tu as le handle du fichier dans ta variable (open($variable,"fichier"))
ou bien tu as "slurpé" le fichier qui est dans ta variable maintenant ?

Dans le premier cas, il suffit de faire une boucle qui lit ton fichier
ligne par ligne :
while ($ligne = <$HANDLE_FICHIER>){
print $ligne;
}

Dans le deuxième cas, le plus simple est peut-être de mettre chaque
ligne dans une case d'un tableau ... (soit directement lorsque tu "lis"
le fichier, soit en splittant la chaine sur les retour chariots...)

Essaies de préciser ton problème en tous cas, histoire que les réponses
soient plsu pertinentes :)

Azra
Avatar
CrazyCat
azrazer wrote:
climb65 a écrit :
j'ai un fichier qui est déjà chargé dans une variable scalaire $file.
Je souhaite y accéder ligne à ligne.
Comment que c'est-y qu'on fait?





Si ce fichier doit toujours être lu ligne par ligne, il serait surement
plus simple de le stocker directement dans un tableau:

open(INF, "fichier");
@lines=<INF>;
close(INF);
foreach $line (@lines)
{
...
}


--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Avatar
climb65
On Tue, 06 Oct 2009 15:31:46 +0200, CrazyCat wrote :

azrazer wrote:
climb65 a écrit :
j'ai un fichier qui est déjà chargé dans une variable scalaire $file.
Je souhaite y accéder ligne à ligne. Comment que c'est-y qu'on fait?





Si ce fichier doit toujours être lu ligne par ligne, il serait surement
plus simple de le stocker directement dans un tableau:

open(INF, "fichier");
@lines=<INF>;
close(INF);
foreach $line (@lines)
{
...
}



Rappel :

le fichier est déjà lu et se trouve dans une variable scalaire.

Remarque : je suis en train de mettre à jour une bibliothèque GNU qui
utilise une classe qui stocke un fichier dans une variable scalaire. De
ce point de vue, je n'ai pas prévu de changer la bibliothèque en
profondeur. D'autant que je n'en suis pas l'auteur.

l'objectif est de filtrer ce fichier (déjà en variable). J'ai trouvé mon
procédé (un sed-like conditionnel version PERL) mais malheureusement, il
ne fonctionne que ligne-à-ligne.

L'idéal aurait été quelque chose comme :

$file =~ s/blabla/mg;

J'ai trouvé l'expression sed parfaite mais je n'arrive pas à la convertir
en PERL. Comme dit plus tôt, le seul procédé PERL que j'ai trouvé
fonctionne ligne-à-ligne.

Donc, je résume :

1) soit je converti temporairement mon scalaire en tableau afin de le
traiter ligne à ligne. Il faudra ensuite que je (re)génère mon scalaire
nouvellement filtré.
2) soit je trouve la syntaxe parfaite du style $file =~ s/bidule/mg;

Pour les curieux, voici ce filtre sed qui fonctionne :

/TXT/!s/;.*$//mg

Il dit de supprimer tout ce qui suit un ";" sauf si on trouve les
caractères "TXT".
Avatar
CrazyCat
climb65 wrote:
le fichier est déjà lu et se trouve dans une variable scalaire.
l'objectif est de filtrer ce fichier (déjà en variable). J'ai trouvé mon
procédé (un sed-like conditionnel version PERL) mais malheureusement, il
ne fonctionne que ligne-à-ligne.
L'idéal aurait été quelque chose comme :
$file =~ s/blabla/mg;

J'ai trouvé l'expression sed parfaite mais je n'arrive pas à la convertir
en PERL. Comme dit plus tôt, le seul procédé PERL que j'ai trouvé
fonctionne ligne-à-ligne.
Pour les curieux, voici ce filtre sed qui fonctionne :
/TXT/!s/;.*$//mg



Effectivement, c'est bien plus clair et j'ai peur que tu ne sois obligé
de convertir ta variable en tableau (split sur n).


--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Avatar
Pierre
Tue, 06 Oct 2009 17:19:44 +0200, CrazyCat wrote :

climb65 wrote:
le fichier est déjà lu et se trouve dans une variable scalaire.
l'objectif est de filtrer ce fichier (déjà en variable). J'ai trouvé
mon procédé (un sed-like conditionnel version PERL) mais
malheureusement, il ne fonctionne que ligne-à-ligne.
L'idéal aurait été quelque chose comme : $file =~ s/blabla/mg;

J'ai trouvé l'expression sed parfaite mais je n'arrive pas à la
convertir en PERL. Comme dit plus tôt, le seul procédé PERL que j'ai
trouvé fonctionne ligne-à-ligne.
Pour les curieux, voici ce filtre sed qui fonctionne : /TXT/!s/;.*$//mg



Effectivement, c'est bien plus clair et j'ai peur que tu ne sois obligé
de convertir ta variable en tableau (split sur n).



Bon, c'est fait. Cela fonctionne. Même si cela semble un peu lourd comme
code. Mais bon, l'essentiel est que cela marche.

Merci bien pour les tuyaux.
Avatar
CrazyCat
Pierre wrote:
Bon, c'est fait. Cela fonctionne. Même si cela semble un peu lourd comme
code. Mais bon, l'essentiel est que cela marche.



Oui, c'est souvent lourd le retraitement de fichiers/variables de ce
genre, et pas qu'en perl, je peux te l'assurer.
D'un autre côté, c'est beaucoup plus clair et simple à
entretenir/corriger lorsque la regexp est "simple" et qu'elle s'applique
sur des éléments bien maitrisés.

Mais ce n'est que mon avis :)

Merci bien pour les tuyaux.



De rien :)

--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Avatar
azrazer
On Tue, 06 Oct 2009 14:11:13 +0000, climb65 wrote:

On Tue, 06 Oct 2009 15:31:46 +0200, CrazyCat wrote :


[...]

/TXT/!s/;.*$//mg

Il dit de supprimer tout ce qui suit un ";" sauf si on trouve les
caractères "TXT".


Re-bonjour,
bon apres de longues recherches infructueuses, la question m'interessant
je me suis adresse a c.l.p.m voici la reponse [elegante et qui marche
bien...] :

$my_text =~ s/(.*)(;.*)/$1 . (index($1, 'TXT') == -1 ? '' : $2)/ge;

Bonne nuit !

azra
Avatar
Denis Dordoigne
Bonjour,

J'ai trouvé l'expression sed parfaite mais je n'arrive pas à la convertir
en PERL.


Il y a l'outil s2p, fourni avec perl, qui fait cela :
http://fr.perldoc.org/perlutil.html#CONVERTISSEURS

--
Denis Dordoigne
Membre de l'April - promouvoir et défendre le logiciel libre - april.org
Rejoignez maintenant plus de 5 000 personnes, associations,
entreprises et collectivités qui soutiennent notre action
Avatar
CrazyCat
azrazer wrote:
Re-bonjour,
bon apres de longues recherches infructueuses, la question m'interessant
je me suis adresse a c.l.p.m voici la reponse [elegante et qui marche
bien...] :

$my_text =~ s/(.*)(;.*)/$1 . (index($1, 'TXT') == -1 ? '' : $2)/ge;



Joli, félicitations.

--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Avatar
climb65
On Tue, 06 Oct 2009 22:19:16 +0000, azrazer wrote :

On Tue, 06 Oct 2009 14:11:13 +0000, climb65 wrote:

On Tue, 06 Oct 2009 15:31:46 +0200, CrazyCat wrote :


[...]

/TXT/!s/;.*$//mg

Il dit de supprimer tout ce qui suit un ";" sauf si on trouve les
caractères "TXT".


Re-bonjour,
bon apres de longues recherches infructueuses, la question m'interessant
je me suis adresse a c.l.p.m voici la reponse [elegante et qui marche
bien...] :

$my_text =~ s/(.*)(;.*)/$1 . (index($1, 'TXT') == -1 ? '' : $2)/ge;

Bonne nuit !

azra



Ah, excellent! Bonne recherche. Merci.