Diff : obtenir uniquement les lignes ajout=c3=a9es
15 réponses
Migrec
Bonjour,
J'ai un fichier CSV avec des identifiants, des mots de passes et
quelques autres données.
J'aimerai extraire les lignes ajoutées au fichier ANCIEN.csv par rapport
au fichier NOUVEAU.csv. Certains lignes ont été modifiées et celles-ci
ne m'intéressent pas. À noter que j'ai une adresse mail dans chaque
ligne qui pourrait servir d'identifiant unique...
On Wed, Sep 20, 2017 at 04:48:43PM +0200, Migrec wrote:
Bonjour,
Bonjour Migrec,
J'ai un fichier CSV avec des identifiants, des mots de passes et quelques autres données. J'aimerai extraire les lignes ajoutées au fichier ANCIEN.csv par rapport au fichier NOUVEAU.csv. Certains lignes ont été modifiées et celles-ci ne m'intéressent pas. À noter que j'ai une adresse mail dans chaque ligne qui pourrait servir d'identifiant unique... Comment feriez-vous ?
Je ne vais pas interférer avec votre discussion pour une solution en Perl, mais je signale une autre option : $ diff --old-line-format="" --new-line-format='%L' --unchanged-line-format="" <ancien_fichier> <nouveau_fichier> Les options de « diff » suivantes pourraient également t'être utiles : --ignore-blank-lines --ignore-case --ignore-space-changes Pas sûr que cela soit nécessaire mais l'utilitaire suivant pourrait également t'être utile : $ apt show dos2unix -- ___________________ | $ post_tenebras ↲ | waouh! | GNU / | | -- * -- | o | $ who ↲ / |_-- ~_| | Alexandre Hoïde | _/| | -------------------
On Wed, Sep 20, 2017 at 04:48:43PM +0200, Migrec wrote:
Bonjour,
Bonjour Migrec,
J'ai un fichier CSV avec des identifiants, des mots de passes et quelques
autres données.
J'aimerai extraire les lignes ajoutées au fichier ANCIEN.csv par rapport au
fichier NOUVEAU.csv. Certains lignes ont été modifiées et celles-ci ne
m'intéressent pas. À noter que j'ai une adresse mail dans chaque ligne qui
pourrait servir d'identifiant unique...
Comment feriez-vous ?
Je ne vais pas interférer avec votre discussion pour une solution en
Perl, mais je signale une autre option :
On Wed, Sep 20, 2017 at 04:48:43PM +0200, Migrec wrote:
Bonjour,
Bonjour Migrec,
J'ai un fichier CSV avec des identifiants, des mots de passes et quelques autres données. J'aimerai extraire les lignes ajoutées au fichier ANCIEN.csv par rapport au fichier NOUVEAU.csv. Certains lignes ont été modifiées et celles-ci ne m'intéressent pas. À noter que j'ai une adresse mail dans chaque ligne qui pourrait servir d'identifiant unique... Comment feriez-vous ?
Je ne vais pas interférer avec votre discussion pour une solution en Perl, mais je signale une autre option : $ diff --old-line-format="" --new-line-format='%L' --unchanged-line-format="" <ancien_fichier> <nouveau_fichier> Les options de « diff » suivantes pourraient également t'être utiles : --ignore-blank-lines --ignore-case --ignore-space-changes Pas sûr que cela soit nécessaire mais l'utilitaire suivant pourrait également t'être utile : $ apt show dos2unix -- ___________________ | $ post_tenebras ↲ | waouh! | GNU / | | -- * -- | o | $ who ↲ / |_-- ~_| | Alexandre Hoïde | _/| | -------------------
Marc Chantreux
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.
c'est donc map {print if not $found_email{ (split /;/)[3] } <$new>;
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.
oula ... je suis largé aussi ... marc
>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.
c'est donc
map {print if not $found_email{ (split /;/)[3] } <$new>;
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.
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.
c'est donc map {print if not $found_email{ (split /;/)[3] } <$new>;
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.
oula ... je suis largé aussi ... marc
Stephane Ascoet
Bonjour, le trop peu connu "Docdiff" pourrait etre une solution. Explications sur <http://web.fdn.fr/~sascoet>(c'est un site un peu comme celui d'un colistier: <https://www.visionduweb.eu/wiki/index.php?title=Utiliser_des_commandes_shell_avec_le_terminal#Lire_les_mails_du_syst%C3%A8me_en_ligne_de_commande_avec_mutt> mais dans lequel j'ai helas vu des erreurs/inextactitudes, donc mefiance avec les informations qui y figurent) -- Cordialement, Stephane Ascoet
Bonjour, le trop peu connu "Docdiff" pourrait etre une solution.
Explications sur <http://web.fdn.fr/~sascoet>(c'est un site un peu comme
celui d'un colistier:
<https://www.visionduweb.eu/wiki/index.php?title=Utiliser_des_commandes_shell_avec_le_terminal#Lire_les_mails_du_syst%C3%A8me_en_ligne_de_commande_avec_mutt>
mais dans lequel j'ai helas vu des erreurs/inextactitudes, donc mefiance
avec les informations qui y figurent)
--
Cordialement, Stephane Ascoet
Bonjour, le trop peu connu "Docdiff" pourrait etre une solution. Explications sur <http://web.fdn.fr/~sascoet>(c'est un site un peu comme celui d'un colistier: <https://www.visionduweb.eu/wiki/index.php?title=Utiliser_des_commandes_shell_avec_le_terminal#Lire_les_mails_du_syst%C3%A8me_en_ligne_de_commande_avec_mutt> mais dans lequel j'ai helas vu des erreurs/inextactitudes, donc mefiance avec les informations qui y figurent) -- Cordialement, Stephane Ascoet
Marc Chantreux
salut,
#!/usr/bin/perl -w my $file1 = $ARGV[0]; my $file2 = $ARGV[1]; open(my $old, '<', $file1) or die "Can't open $file1: $!"; open(my $new, '<', $file2) or die "Can't open $file2: $!"; my %found_email = map { (split /;/)[3] => 1 } <$old>; map {print if not $found_email{ (split /;/)[3] }} <$new>;
pe en rajoutant chomp ? my ($new,$old) map { open my $fh, '<', $_ or die "Can't open $_: $!"; $fh } @ARGV; my %found_email = map {chomp; (split /;/)[3] => 1 } <$old>; map {chomp; print if not $found_email{ (split /;/)[3] }} <$new>; par contre: ton fichier est un CSV comme son nom l'indique: il y a plein de cas que tu ne prend pas en compte en splitant naivement sur ';' (par exemple un champ qui contiendrait un ";"). pour rendre ton script robuste, ne réinvente pas la roue et utilise Text::CSV ou mieux Text::CSV::Simple. si j'en ai le temps, je t'écrirais un exemple plus tard. marc
salut,
#!/usr/bin/perl -w
my $file1 = $ARGV[0];
my $file2 = $ARGV[1];
open(my $old, '<', $file1) or die "Can't open $file1: $!";
open(my $new, '<', $file2) or die "Can't open $file2: $!";
my %found_email = map { (split /;/)[3] => 1 } <$old>;
map {print if not $found_email{ (split /;/)[3] }} <$new>;
pe en rajoutant chomp ?
my ($new,$old) map { open my $fh, '<', $_ or die "Can't open $_: $!"; $fh }
@ARGV;
my %found_email = map {chomp; (split /;/)[3] => 1 } <$old>;
map {chomp; print if not $found_email{ (split /;/)[3] }} <$new>;
par contre: ton fichier est un CSV comme son nom l'indique: il y a
plein de cas que tu ne prend pas en compte en splitant naivement sur ';'
(par exemple un champ qui contiendrait un ";").
pour rendre ton script robuste, ne réinvente pas la roue et utilise
Text::CSV ou mieux Text::CSV::Simple.
si j'en ai le temps, je t'écrirais un exemple plus tard.
#!/usr/bin/perl -w my $file1 = $ARGV[0]; my $file2 = $ARGV[1]; open(my $old, '<', $file1) or die "Can't open $file1: $!"; open(my $new, '<', $file2) or die "Can't open $file2: $!"; my %found_email = map { (split /;/)[3] => 1 } <$old>; map {print if not $found_email{ (split /;/)[3] }} <$new>;
pe en rajoutant chomp ? my ($new,$old) map { open my $fh, '<', $_ or die "Can't open $_: $!"; $fh } @ARGV; my %found_email = map {chomp; (split /;/)[3] => 1 } <$old>; map {chomp; print if not $found_email{ (split /;/)[3] }} <$new>; par contre: ton fichier est un CSV comme son nom l'indique: il y a plein de cas que tu ne prend pas en compte en splitant naivement sur ';' (par exemple un champ qui contiendrait un ";"). pour rendre ton script robuste, ne réinvente pas la roue et utilise Text::CSV ou mieux Text::CSV::Simple. si j'en ai le temps, je t'écrirais un exemple plus tard. marc
Migrec
Le 25/10/2017 à 10:54, Marc Chantreux a écrit :
salut,
#!/usr/bin/perl -w my $file1 = $ARGV[0]; my $file2 = $ARGV[1]; open(my $old, '<', $file1) or die "Can't open $file1: $!"; open(my $new, '<', $file2) or die "Can't open $file2: $!"; my %found_email = map { (split /;/)[3] => 1 } <$old>; map {print if not $found_email{ (split /;/)[3] }} <$new>;
pe en rajoutant chomp ? my ($new,$old) > map { open my $fh, '<', $_ or die "Can't open $_: $!"; $fh } @ARGV; my %found_email = map {chomp; (split /;/)[3] => 1 } <$old>; map {chomp; print if not $found_email{ (split /;/)[3] }} <$new>; par contre: ton fichier est un CSV comme son nom l'indique: il y a plein de cas que tu ne prend pas en compte en splitant naivement sur ';' (par exemple un champ qui contiendrait un ";"). pour rendre ton script robuste, ne réinvente pas la roue et utilise Text::CSV ou mieux Text::CSV::Simple. si j'en ai le temps, je t'écrirais un exemple plus tard.
Ça passe pas... :-( $ ./listerLesNouveaux3.pl Ancien.csv Nouveau.csv Adresseligne2";"";"";"";"";"";""RENOM";"";"AdresseLigne1";"";"";"";"";"";""
Le 25/10/2017 à 10:54, Marc Chantreux a écrit :
salut,
#!/usr/bin/perl -w
my $file1 = $ARGV[0];
my $file2 = $ARGV[1];
open(my $old, '<', $file1) or die "Can't open $file1: $!";
open(my $new, '<', $file2) or die "Can't open $file2: $!";
my %found_email = map { (split /;/)[3] => 1 } <$old>;
map {print if not $found_email{ (split /;/)[3] }} <$new>;
pe en rajoutant chomp ?
my ($new,$old) > map { open my $fh, '<', $_ or die "Can't open $_: $!"; $fh }
@ARGV;
my %found_email = map {chomp; (split /;/)[3] => 1 } <$old>;
map {chomp; print if not $found_email{ (split /;/)[3] }} <$new>;
par contre: ton fichier est un CSV comme son nom l'indique: il y a
plein de cas que tu ne prend pas en compte en splitant naivement sur ';'
(par exemple un champ qui contiendrait un ";").
pour rendre ton script robuste, ne réinvente pas la roue et utilise
Text::CSV ou mieux Text::CSV::Simple.
si j'en ai le temps, je t'écrirais un exemple plus tard.
#!/usr/bin/perl -w my $file1 = $ARGV[0]; my $file2 = $ARGV[1]; open(my $old, '<', $file1) or die "Can't open $file1: $!"; open(my $new, '<', $file2) or die "Can't open $file2: $!"; my %found_email = map { (split /;/)[3] => 1 } <$old>; map {print if not $found_email{ (split /;/)[3] }} <$new>;
pe en rajoutant chomp ? my ($new,$old) > map { open my $fh, '<', $_ or die "Can't open $_: $!"; $fh } @ARGV; my %found_email = map {chomp; (split /;/)[3] => 1 } <$old>; map {chomp; print if not $found_email{ (split /;/)[3] }} <$new>; par contre: ton fichier est un CSV comme son nom l'indique: il y a plein de cas que tu ne prend pas en compte en splitant naivement sur ';' (par exemple un champ qui contiendrait un ";"). pour rendre ton script robuste, ne réinvente pas la roue et utilise Text::CSV ou mieux Text::CSV::Simple. si j'en ai le temps, je t'écrirais un exemple plus tard.
Ça passe pas... :-( $ ./listerLesNouveaux3.pl Ancien.csv Nouveau.csv Adresseligne2";"";"";"";"";"";""RENOM";"";"AdresseLigne1";"";"";"";"";"";""