index => perl => exemple de script => un exemple de script (update_dico)

Mise à jour des dicos de Traduction



Ce script met à jour deux dicos de traduction ou deux fichiers ayant une information par ligne. Voici sont principe:
Il prend chaque ligne unique des deux fichiers pour les trier puis les placer dans un troisiéme fichier qu'il renomera soit comme le premier, soit comme le second soit sous un nom original, à votre convenance.
Il s'avére trés pratique dans beaucoup de cas.
écrit par:         alain Adelmar


Il suffit de modifier juste la première ligne pour qu'il fonctionne avec le Perl de Windows bien que je ne l'ai pas encore testé.
écrire     #!perl -w     au lieu de    #!/usr/bin/perl -w
aadelmar@wanadoo.fr

#!/usr/bin/perl -w
# remd: ce script perl va faire une copie(a) d'un fichier(A).
# Il triera(a) puis refera la même chose sur un autre fichier(B).
# Il comparera les deux fichier (a) et (b) pour créer un fichier(c)
# qui contiendra toute les lignes de (a) qui n'appartienent pas à (b)
# et toutes les lignes de (b) qui n'appartienent pas à (a). Il triera le tout
# pour en faire un ficher(C) quil renomera du nom du fichier(A).
# Il tourne bien et fait bien plus que ca, je suis content. 18:33 25 janvier 2002
# alain Adelmar

$dt = localtime(time);
$q =~ /^q|quit/;
@c = <F3>;   #assignation de @c

print "Voici un script qui va vous permettre de mettre à jour 2 fichiers, il triera et effacera les doublons\npour ne garder que les lignes originales des deux fichier.\nPour continuer taper <Enter\>\tpour quitter tapez q:\n";
$quitte = <STDIN>;
chomp $quitte;
if ($quitte eq $q) {
  print "tchao!!!";
  system '/bin/clear';
  END;
}

print "Indiquer quel fichier vous voulez updater en premier\n";
$f1 = <STDIN>;
chomp $f1;
until (-e $f1) {
  print "le nom de fichier complet $f1 n'existe pas veuillez le re-enter:\n";
  $f1 = <STDIN>;
  chomp $f1;
}

# ouverture lecture du premier fichier
open F1, "$f1" or die "ouverture impossible de $f1 $!";
@contenu1 = <F1>;
close F1 || die "fermeture impossible $!";

# copier le contenu trier dans un fichier d'echange (cop_file1)
$cf1 = "copi_" . "$f1";
open CF1, ">$cf1" or die "création du fichier d\'echange $cf1 impossible $!";
@nw1 = sort @contenu1;
print CF1 @nw1;
#close CF1 || die "Fermeture de $cf1 compromise $!";

#-- pareil avec le 2éme-----placer ceci et au-dessus dans une seule routine.

print "Indiquer le nom du second fichier vous voulez updater\n";
$f2 = <STDIN>;
chomp $f2;
until (-e $f2) {
  print "le nom de fichier complet $f1 n'existe pas veuillez le re-enter:\n";
  $f2 = <STDIN>;
  chomp $f2;
}

# ouverture lecture du second fichier
open F2, "$f2" or die "ouverture impossible de $f2 $!";
@contenu2 = <F2>;
close F2 || die "fermeture impossible $!";

# copier le contenu trier dans un fichier d'echange (cop_file1)
$cf2 = "copi_" . "$f2";
open CF2, ">$cf2" or die "création du fichier d\'echange $cf2 impossible $!";
@nw2 = sort @contenu2;
print CF2 @nw2;
#close CF2 || die "Fermeture de $cf2 compromise $!";

# on peut eviter de tout écrire dans des fichiers différant mais bon....
# on propose un nom pour l'update(C) de A et B. (la aussi on peut faire +simple)

($racine1, $ext1) = split(/\./, $f1);
($racine2, $ext2) = split(/\./, $f2);

if (defined $ext1) {
  $choix1 = "$racine1_" . "$dt\." . "$ext1";
}
else {
 $choix1 = "$racine1_" . "$dt";
}
if (defined $ext2) {
  $choix2 = "$racine2_" . "$dt\." . "$ext2";
}
else {
  $choix2 = "$racine2_" . "$dt";
}

$choix3 = "update_" . "$dt\." . "$racine1";
 

#++++++++++++++++++++++++++++++++ tout le travail tien là
# Il vaut mieux faire un hachage par mot anglais de @c (somme de @a et @b).
# En profiter pour prendre les traductions les + longues
 
 
 
 

foreach $ligne(@nw1, @nw2) {
  next if ($ligne =~ /""/);
  next if ($ligne =~ /^[A-Z]/);
  if ($ligne =~ /\w\,\w/) {
    ($ma, $trad)= split(/\,/,$ligne);
    print "mot anglais: $ma = $trad\n";     #test pour controler les données du futur hashage
    $hpma{$ma}= $trad;
    $f1h{$ligne}++;
  }
  next if ($ligne =~ /(ed|ing|ness|ty|ly)$/);
  $f2h{$ligne}++;
}

foreach $ma (keys %hpma) {
  $lg = "$ma," . $hpma{$ma};
  print "$lg\n";
  push @d, $lg;
}

$fx = "test_U2F.log";
open FX, ">$fx" or die "ouverture de $fx impossible $!";
@d = (sort @d);
print FX @d;
close FX or die "fermeture impossible $!";

foreach $ligne (keys %f1h) {
  push @c, $ligne;
}

foreach $ligne (keys %f2h) {
  push @e, $ligne;
}

$fe = "up_better.log";
open FE, ">$fe" or die "ouverture de $fe impossible $!";
@e = (sort @e);
print FE @e;
close FE or die "fermeture de $fe impossible $!";

@c = (sort @c);       # tant qu'a faire
#+++++++++++++++++++++++++++++++++
close CF1 || die "Fermeture de $cf1 compromise $!";
close CF2 || die "Fermeture de $cf2 compromise $!";

print "Quel nom voulez vous donner au fichier updaté:\n(1)\t$choix1\n(2)\t$choix2\n(3)\t$choix3(par defaut)\nNota:Ce fichier ne remplacera pas $f1 ou $f2 sans votre aval\, plus tard\n";
$nchoix = <STDIN>;
chomp $nchoix;

if ($nchoix eq "1") {
  $choix = "$choix1";
}
elsif ($nchoix eq "2") {
  $choix = "$choix2";
}
else {$choix = "$choix3"}

open F3, ">$choix" or die "Ouverture impossible $choix $!";
print F3 @c;
close F3 || die "fermeture impossible de $choix $!";

print "Voulez vous consulter le fichier $choix avant de prendre une décision quand au remplacement des originaux?\n(oui-non)";
$resp = <STDIN>;
chomp $resp;

$resp =~ tr/A-Z/a-z/;

if ($resp =~ /^o|oui/) {
  print "@c" . "\n";
}

print "\n\nVoulez vous dans ce cas\, remplacer les fichiers $f1 et $f2 par $choix\n";
chomp ($resp = <STDIN>);

if($resp =~ /^o|oui/) {
  print "vous avez choisi d\'effacer les fichiers $f1 et $f2\n";
  rename "$f1","$choix";
print "tchao\n";
}
END;



index => perl => exemple de script