Exemple de traitement de document

alain Adelmar
                                                                          aadelmar@numericable.fr beuuh c est quoi ca

Ce programme décortique un fichier html pour en sortir deux fichiers, l'un est un rapport (le double du rapport écran, propre), l'autre est un fichier .csv directement chargeable par n'importe quel tableur. De plus ce script permet une interrogation de tel ou telle opérations.
Je travaille en se moment sur sa mise à jour automatique.
Que je posterai bien sûr dés qu'il fonctionnera par tous les temps. alain Adelmar
(p.s: Quand on édite au fur et à mesure que l'on apprend, tout les exemples précédant semblent obsolète car si je devais les réécrire maintenant il tiendrai sur 10 lignes maximum et surtout je ne le ferai pas comme ça. Comme quoi Perl permet une multitude de façons et manières de le faire)


le code
#!/usr/bin/perl -w
# remd: nettoyage de page shtml de (400 dernières opérations ccp)
# pour en sortir un fichier texte listé par opération et une table de hash
# pour rechercher une operation par la date ou le montant ou le label,
# alain adelmar nov 2000
# *******************************************ce prog tourne a merveille

format STDOUT_TOP =
Page @<<
$%

Date Transaction francs euros
===== ========================== ======== ======
.


print "Entrez le nom du fichier a traiter\n";
$file = ;
chomp $file;

print "je traite le fichier $file\n";
$z = 0;


$filout = "./log_a.txt";
$filoutcsv = "log400tr.csv";

#----------- construction du hash et de la liste de liste.
# non deux hash: un sur la date,valeur de la ligne
# l'autre sur la désignation valeur de la ligne.


$t = 0; # compte les lignes (en dur) du fichier source.
$a = $b = 0; # francs ou euro (initialisation des tab & ls, nmb de tr).

@nwcontenu = ; # assigne la variable liste au handle FO.
@tcsv = ; # idem pour @tcsv à FV.



open(F, "$file") or die "merde pbOpsrc $!";
@contenu = ;
close F or die "remerde pbfermsrc $!";


foreach $ligne(@contenu) {
$t++; # compte lignes et dégage la merde.
if ($t <= 82) {
print "#";
}
elsif ($t <= 83) { # entete
$ligne = "date,designation,francs,euros" . "\n";
tlib_csv($ligne);
print "\ntraitement maintenant\n";
}
else {
$ligne =~ s/^(<.*?>)?//;
$ligne =~ s/^(<.*?>)?//;

$ligne =~ s/()(<.*?>)+//;
$ligne =~ s/()(<.*?>)+//;

$ligne =~ s/\n//; # ote les sauts de lignes.
next if ($ligne eq ""); # et degage les ligne vides.

# reconnaitre le champ francs et le champ euro. (1/2)
if ($ligne =~ m/^\d{0,1}.*?\d{1,3}.?\d{2} /) {
if ($a == $b) {
$ligne =~ s/().{1}nbsp.?//;
#*****format
chomp $ligne; # ligne francs = $ligne
$lf = $ligne;
#**********
$ligne =~ s/,/./;
$ligne = $lcsv . ",";
tlib_csv($ligne);
#**********
$ligne = $ligne . " francs";
$a++;
}
else {
$ligne =~ s/().{1}nbsp.?//;
chomp $ligne;
$le = $ligne;
write;
#========table de hash par la date
$line = "$ldt" . "\t$ldg\t$lf\t$le\n";
%date = ("$ldt" => "$line");

#======
# assignation d'une ligne de transaction
@ltr = qw($ld $lf $le $ldg);
$lstr[$a] = (@ltr);
#************
$ligne =~ s/,/./;
$ligne = $ligne . "\n";
tlib_csv($ligne);
$b++;
}
}

# reconnaitre le champ date.
elsif ($ligne =~ m/^\d{2}\/\d{2}/) {
chomp $ligne;
$ldt = $ligne;
tlib_csv($ligne);
$ligne = $ligne . "\t";
}

elsif ($ligne =~ m/^.*?\w.?/) {
chomp $ligne;
$ldg = $ligne;
tlib_csv($ligne);

#**********************************alignement sans format***
if (length $ligne <= 16) {
$ligne = $ligne . "\t\t\t\t";
}
elsif (length $ligne <= 24) {
$ligne = $ligne . "\t\t\t";
}
elsif (length $ligne <= 32) {
$ligne = $ligne . "\t\t";
}
else {
$ligne = $ligne . "\t";
}
}
# dépose chaque element avec "\n" aprés euro.
push @nwcontenu, $ligne;
}
}

sub tlib_csv {
my($ligne) = @_;
$lcsv = $ligne;
$lcsv = $lcsv . ",";
push @tcsv, $lcsv;
}

print "\n$t lignes traitees pour $a operations enregistrees.\n";

#*********************************
# confection d'un fichier db





open (FO, ">$filout") or die "merde pbOpcible $!";
print FO @nwcontenu;
close FO or die "rem pbfermcible $!";

open (FV, ">$filoutcsv") or die "mutain de poine ca couille pbOpfls $!";
print FV @tcsv;
close FV or die "flute that's os pbShutfls $!";

print "Voilà, les deux fichier sont créés:\nlog_a.txt => pour un listing texte\n
log400tr.csv => pour une db (séparé par des virgule).\n";

print " Voulez vous jeté une oeil ? [o/n]\n";
$resp = ;





#-------- appel a oui_non dans boucle while, fort isn't it ?
while (! oui_non($resp)) {
print "indiquer le numéro de la transaction:\n";
chomp($numt = );
@lined = $date{$numt};
foreach ($meme_jour(@lined)) {
print "transaction\t $meme_jour\n";
print "voulez vous continuer ? [o-n]\n";
chomp($resp = );
}


print "tchao !!\n";

#-------------- oui-non -----faire une routine qui renvoie 1 si oui
sub oui_non {
my($rep) = @_;

$rep =~ s/\W.*//;
$resp =~ tr/A-Z/a-z/;
if ($rep =~ /^o|y/) {
return 0; # faux pour while(! oui_non($resp))
}
else {
return 1; # vrai pour sortir
}
}

format STDOUT =
@<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<< @<<<<<<<
$ldt, $ldg, $lf, $le
.

END;



# fin du programme, depuis en enlevant le superflu j'ai réussi à lui faire faire une copie de l'original pour pouvoir le renomer (rccp0101.html au lieu de releve_ccp_plus.html en incorporant la date en jour dans le titre du fichier) et ainsi pouvoir téléchargé directement toute les semaines. Le programme fait une mise à jour automatique, je le peaufine et vous le sert dés que possible.