Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Diff : obtenir uniquement les lignes ajout=c3=a9es

15 réponses
Avatar
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...

Comment feriez-vous ?

--
Migrec

5 réponses

1 2
Avatar
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 :
$ 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   |  _/| |
 -------------------
Avatar
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
Avatar
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
Avatar
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
Avatar
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";"";"";"";"";"";""
1 2