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