Le 24/10/2017 à 17:31, Marc Chantreux a écrit :
Oui effectivement il fonctionne ce script perl... mea culpa.
C'est simplement le fichier initial (pas de retour chariot à
l'intérieur des lignes) qui diffère du fichier actuel (retours
chariot dans les lignes).
hello,

il y a pas mal d'amélioration possibles pour rendre ton script
un peu plus facile a maintenir mais voilà celle qui me parait la plus
intéressante

tu écris

my %lines;
foreach (<$old>) {
       my ($f1, $f2, $f3, $email, $f4, $f5, $f6, $f7,$f8) = split /;/;
       $lines{$email} = 1;
}

hors seul le champ $email t'intéresse alors ne garde que celui-ci

my %lines;
foreach (<$old>) {
       my $email = (split /;/)[3];
       $lines{$email} = 1;
}

et là on se rend compte que lines ne contient pas des lignes
mais une paire pour chaque ligne avec une adresse email en clef et
1 comme valeur unique ( $email => 1 ). du coup on peut écrire

my %found_email = map { (split /;/)[3] => 1 } <$old>;

de meme on filtrera ton 2eme fichier presque de la meme manière

map {print if $found_email{ (split /;/)[3] } <$new>;

Effectivement, c'est bien plus simple ainsi. Malheureusement, je n'y connais rien en perl... J'ai juste mis une négation (not)= après le dernier if afin de garder que les lignes différentes.

Mais quoique je fasse, la sortie inclut toute de même les lignes faisait suite à un retour chariot... Solution temporaire : supprimer la colonne Adresse avec un tableur et passer le script.

--
Migrec

Reply via email to