Dernier script traduisant le fichier releve_ccp_plus.html ( vos 400 dernières opérations avec videoposte, la poste en ligne: http://www.videoposte.com/videoposte/ ), en 3 rapports de formats différant.
Sur Windows, en DOS tapez: C:\Perl\eg perl r2ccp.pl
Sur Linux ou UNIX taper d'abord: chomp +x r2ccp.pl
pour le rendre executable puis simplement: ./r2ccp.pl
N'hesiter pas à me contacter
Adelmar Alain a.adelmar@wanadoo.fr
#!perl -w
#******************************************************************************
# remd: nettoyage des pages
téléchargées depuis http://www.videoposte.com *
# (400 derniéres transactions
ccp) au format html pour en sortir *
# 2 fichiers: un rapport
(.txt) et un (.csv) plus une copie écran *
# d'autre part, possibilité
d'intéroger le programme par numero de transaction*
# _ Ce Programme Fonctionne
correctement _. *
# *****************************************************************************
# alain Adelmar commencer
en nov 2000 ~ repris en juin 2002 *
#******************************************************************************
#*************sortie formater
pour l'ecran
formatSTDOUT_TOP
=
Page@<<
$%
Date Transaction francs euros
===== ==========================
======== ======
.
# initialisation des variables.
$lmonnaie
= $le =$t
=$a
=$b
= 0;
$x =
"x*" x 25;
$dnow = (localtime[6]);
#reconstruction des dates
$mois_v={
"janvier"
=> "01",
"fevrier" => "02",
"mars" => "03",
"avril" => "04",
"mai" => "05",
"juin" => "06",
"juillet" => "07",
"aout" => "08",
"septembre" => "09",
"octobre" => "10",
"novembre" => "11",
"decembre" => "12"
};
print
"Entrez le nom du fichier a traiter\n";
$file
= <STDIN>;
chomp$file;
unless (-e$file)
{
print
"veuillez entrer un nom de fichier valide\net le chemin si il ne se trouve
pas dans le repertoire actuel\n";
$file
= <STDIN>;
chomp $file;
}
$filout = "rapport_" . "$dnow" . '.txt';
$filoutcsv = "rapport_db_" . "$dnow" .
'.csv';
@nwcontenu;
@tcsv;
open(F, "$file")
or
die "merde pbOpsrc $!";
@contenu = <F>;
close F or
die "remerde pbfermsrc $!";
foreach $ligne(@contenu)
{
$t++;
if ($t
<= 82) {
if ($t == 49) {
$ligne =~ s/^.{74}()/$1/;
$dds = $ligne;
#date debut solde
($jour_S, $mois_S,
$annee_S)
= split(/\s/,
$dds);
$annee_D= ($annee_S -1);
print "\nPeriode recensant 400 transactions de $annee_D jusqu au
$jour_S $mois_S $annee_S\n";
}
print "#";
}
elsif
($t <= 83) {
$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.
$ligne =~ s/\s{1,6}()\s{1,6}//;
#
enleve les differents \t\n etc...
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
$lf = $ligne; #
ligne francs = $ligne
chomp $lf;
#**********
&routine4csv($ligne);
#**********
$ligne = $ligne . " francs";
$a++;
}
else {
# les euros ***************
$ligne =~
s/().{1}nbsp.?//;
$le = $ligne;
chomp $le;
write;
# pour un hashage qui garde
le principal en scalaire spitable
$tl{$b}
= "$ldt" . "_" . "$ldg"
. "_" . "$lf" . "_" . "$le"
. "_" . "$b";
# *
#************************************************************
#****pour le fichier csv
$el = 1;
&routine4csv($ligne);
#***********
$ligne = $ligne
. " euro\n";
$b++;
}
}
# reconnaitre le champ date.
elsif ($ligne
=~ m/^\d{2}\/\d{2}/)
{
#*******format
$ldt = $ligne;
chomp $ldt;
#******pour csv
&routine4csv($ligne);
#*********** pour la presentation
du fichier txt
$ligne =
$ligne . "\t";
}
elsif ($ligne
=~ m/^.*?\w.?/)
{
#**********format
$ldg = $ligne;
chomp $ldg;
#**********fichier csv
&routine4csv($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";
}
}
push @nwcontenu,
$ligne;
}
}
sub tlib_csv {
my($ligne)
= @_;
push @tcsv,
$ligne;
}
print "\n$t lignes traitees pour $a operations enregistrees.\n";
#*********************************
# confection d'un fichier
csv par
sub routine4csv($ligne) {
my($ligne)= @_;
$lcsv = $ligne;
if ($lmonnaie
== 1) {
$lcsv =~
s/,/./;
if ($el
== 1) {
# rajoute un saut de ligne
derriere euro
$lcsv = "$lcsv"
. "\n";
$el = 0;
$lmonnaie = 0;
}
else {
# si c'est des fr rajoute
une virgule
$lcsv =
$ligne . ",";
}
}
else {
$lcsv = $ligne
. ",";
}
push @tcsv,
$lcsv;
}
#@ttr400ccp = (@tdate, @tfrancs, @teuro, @tdesign);
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\nlog400tr.csv => pour une db (séparé par des virgule).\n";
#ici début de la partie
intéractive pour appelées tel ou telle transaction (par numérotation
indexé)
print " Voulez vous
jeté une oeil ? [o/n]\n";
$resp = <STDIN>;
#-------- appel a oui_non
dans boucle while, fort isn't it ?
while (!
oui_non($resp)) {
print "$x\n";
print "indiquer le
numéro de la transaction: ";
$rq = <STDIN>;
chomp $rq;
$rl = $tl{$rq};
($dt, $dg,
$frs,
$eur, $nt)=split(/_/,
$rl);
print "\ndate:\t$dt\n";
print "designation:\t$dg\n";
print "somme en fr:\t"
. "$frs" . "\nfont en euro:\t$eur\n";
print "ceci était
la transaction n° $nt\n";
print "$x\n";
#===================================
print "voulez vous
continuer ? [o-n]\n";
$resp = <STDIN>;
}
print "$x\n";
print "tchao !!\n";
print "$x\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
.
# Je prevois de pouvoir ouvrir
plusieurs fichiers de maniére
# à pouvoir centraliser
sur un seul rapport tout les fichiers téléchargés.
END;
#fin du script
pour Linux (copier jusque là) ou la ligne au dessus. Pour Windows
voir au dessous retour en au de la page
Ci-dessous trouvez la version Windows Quasiment identique.
#!/usr/bin/perl -w
#******************************************************************************
# remd: nettoyage
des pages téléchargées depuis http://www.videoposte.com
*
# (400 derniéres
transactions ccp) au format html pour en sortir *
# 2 fichiers:
un rapport (.txt) et un (.csv) plus une copie écran *
# d'autre part,
possibilité d'intéroger le programme par numero de transaction*
# _ Ce Programme
Fonctionne correctement _. *
# *****************************************************************************
# alain Adelmar
commencer en nov 2000 ~ repris en juin 2002 *
#******************************************************************************
#*************sortie
formater pour l'ecran
formatSTDOUT_TOP
=
Page@<<
$%
Date Transaction
francs euros
===== ==========================
======== ======
.
# initialisation
des variables.
$lmonnaie
= $le =$t
=$a
=$b
= 0;
$x =
"x*" x 25;
$dnow = localtime[6];
#reconstruction
des dates
$mois_v={
"janvier" =>
"01",
"fevrier" =>
"02",
"mars" => "03",
"avril" =>
"04",
"mai" => "05",
"juin" => "06",
"juillet" =>
"07",
"aout" => "08",
"septembre"
=> "09",
"octobre" =>
"10",
"novembre"
=> "11",
"decembre"
=> "12"
};
print
"Entrez le nom du fichier a traiter\n";
$file
= <STDIN>;
chomp$file;
unless
(-e $file) {
print
"veuillez entrer un nom de fichier valide\n";
$file
= <STDIN>;
chomp $file;
}
$filout = "rapport_" . "$dnow" . '.txt';
$filoutcsv = "rapport_db_" . "$dnow" .
'.csv';
@nwcontenu;
@tcsv;
open(F,
"$file")
or die "merde
pbOpsrc $!";
@contenu =
<F>;
close
F or die "remerde pbfermsrc
$!";
foreach$ligne(@contenu)
{
$t++;
if ($t
<= 82) {
if ($t
== 49) {
$ligne
=~ s/^.{74}()/$1/;
$dds
= $ligne; #date debut solde
($jour_S,
$mois_S,
$annee_S) = split(/\s/,
$dds);
$annee_D=
($annee_S -1);
print
"\nPeriode recensant 400 transactions de $annee_D jusqu au $jour_S $mois_S
$annee_S\n";
}
print
"#";
}
elsif
($t <= 83) {
$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.
$ligne
=~ s/\s{1,6}()\s{1,6}//;
#
enleve les differents \t\n etc...
next if ($ligneeq
""); # 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
$lf
= $ligne; # ligne francs
= $ligne
chomp$lf;
#**********
&routine4csv($ligne);
#**********
$ligne
= $ligne . " francs";
$a++;
}
else
{
# les euros
***************
$ligne
=~ s/().{1}nbsp.?//;
$le
= $ligne;
chomp$le;
write;
# pour un hashage
qui garde le principal en scalaire spitable
$tl{$b}
= "$ldt" . "_" . "$ldg"
. "_" . "$lf" . "_" . "$le"
. "_" . "$b";
# *
#************************************************************
#****pour le
fichier csv
$el
= 1;
&routine4csv($ligne);
#***********
$ligne
= $ligne . " euro\n";
$b++;
}
}
# reconnaitre
le champ date.
elsif
($ligne =~ m/^\d{2}\/\d{2}/)
{
#*******format
$ldt
= $ligne;
chomp$ldt;
#******pour
csv
&routine4csv($ligne);
#***********
pour la presentation du fichier txt
$ligne
= $ligne . "\t";
}
elsif
($ligne =~ m/^.*?\w.?/)
{
#**********format
$ldg
= $ligne;
chomp$ldg;
#**********fichier
csv
&routine4csv($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";
}
}
push@nwcontenu,
$ligne;
}
}
sub tlib_csv
{
my($ligne)
= @_;
push@tcsv,
$ligne;
}
print "\n$t lignes traitees pour $a operations enregistrees.\n";
#*********************************
# confection
d'un fichier csv par
sub routine4csv($ligne) {
my($ligne)= @_;
$lcsv
= $ligne;
if ($lmonnaie
== 1) {
$lcsv
=~ s/,/./;
if ($el
== 1) {
# rajoute un
saut de ligne derriere euro
$lcsv =
"$lcsv" . "\n";
$el =
0;
$lmonnaie
= 0;
}
else
{
# si c'est
des fr rajoute une virgule
$lcsv
= $ligne . ",";
}
}
else
{
$lcsv
= $ligne . ",";
}
push@tcsv,
$lcsv;
}
#@ttr400ccp = (@tdate, @tfrancs, @teuro, @tdesign);
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\nlog400tr.csv => pour une db (séparé
par des virgule).\n";
#ici début
de la partie intéractive pour appelées tel ou telle transaction
(par numérotation indexé)
print "
Voulez vous jeté une oeil ? [o/n]\n";
$resp
= <STDIN>;
#-------- appel
a oui_non dans boucle while, fort isn't it ?
while
(! oui_non($resp))
{
print
"$x\n";
print
"indiquer le numéro de la transaction: ";
$rq
= <STDIN>;
chomp$rq;
$rl
= $tl{$rq};
($dt,
$dg,
$frs, $eur,
$nt)=split(/_/,
$rl);
print
"\ndate:\t$dt\n";
print "designation:\t$dg\n";
print
"somme en fr:\t" . "$frs" . "\nfont en euro:\t$eur\n";
print
"ceci était la transaction n° $nt\n";
print
"$x\n";
#===================================
print
"voulez vous continuer ? [o-n]\n";
$resp
= <STDIN>;
}
print
"$x\n";
print
"tchao !!\n";
print
"$x\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
.
# Je prevois
de pouvoir ouvrir plusieurs fichiers de maniére
# à
pouvoir centraliser sur un seul rapport tout les fichiers téléchargés.
END;
Voilà, le rapport_db_date.cvs est directement compatible avec Access, Excel, Word ainsi que Gnumeric et tout les autre tableur et base de données, car chaque champs et séparé par une virgule (elle sert de délimiteur). Pratique non?
La prochaine version regroupera les transaction par date, puis par debit ou credit et enfin par Numéro de chéque émis. Je pense que ce sera un outils trés pratique et surtout instantané pour controler sa comptabilité. Pour plus d'ample explication écrivez moi.