OVH Cloud OVH Cloud

algorithme suppression commentaires

11 réponses
Avatar
R12y
Bonjour,

J'ai le code ci dessous qui est censé envoyer sur stdout (dans un premier
temps) les lignes d'un fichier passé en argument mais les lignes utiles,
sans commentairres ni lignes vides. Je n'arrive pas à "trouver la sortie",
car il ne fais pas ce que je veux qu'il fasse...

####################################
import sys, string
fichier_entree=open(sys.argv[1],"r")
lines_list=fichier_entree.readlines()

def clean_list (a_list):
if len(a_list)==1:
if (a_list[0] == '#') or (a_list[0] == ''):
# print ''
print "trouve long 1"
return None
else:
print a_list[0]
return None
else:
if (a_list[0] == '#') or (a_list[0] == ''):
print "trouve un comment"
clean_list (a_list[1:])
return None
else:
print a_list[0]
print "pas trouve comment"
clean_list (a_list[1:])
return None

clean_list (lines_list)
###################################################

Voici son execution.

mihamina-localhost>>>>./suppr_comment.py test.txt
l1

pas trouve comment
# c1

pas trouve comment
l2

pas trouve comment


pas trouve comment


pas trouve comment
# c2

pas trouve comment
l3

(En fait il me rajoute même une ligne vide à chaque fois...)

Voici le contenu du fichier de test:
mihamina-localhost>>>>cat test.txt
l1
# c1
l2


# c2
l3


Concernant le style, oui j'aime bien le style recursif/fonctionnel. ça m'a
séduit. J'espère gérer la plupart de ce que j'aurais à faire avec ce style,
si possible.

--
Un CMS Français à découvrir: CPS. (http://www.cps-project.org)
Hébergement gratuit de sites Zope, Plone, et CPS: http://www.objectis.org
Un lien qui peut servir:
http://www.google.fr/search?q=aspo+infogerance+serveur

1 réponse

1 2
Avatar
Bertrand B



Je ne connais que très peu Perl, mais il me semble qu'une manière d e le
faire pourrait être :

use IO::File;
my $in = new IO::File('<log');
while(<$in>){
my $L = $_;
if(not($L=~/^#/ or $L=~/^ *$/)){



penser à utiliser unless à la place de if not


print $L;
}
}
}
$ time perl comments.pl > /dev/null
real 0m2.297s

(1,5 Million de lignes quand même).
Ce qui est même plus rapide que tous les autres, mais un gourou de Pe rl
passera peut-être par là pour en faire une version d'une ligne et d emi
encore plus rapide.



Je ne suis pas un gourou de Perl mais ceci semble marcher :
cat log | perl -ne 'print unless (/^ *$/ || /^#/)'

Jean-Pierre

L'utilisation du cat suivi d'un pipe m'a toujours choqué

pourquoi ne pas utiliser un simple redirection de stdin ? on évite le
lancement d'un processus.
perl -ne 'print unless (/^ *$/ || /^#/)' < log


1 2