[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Diff : obtenir uniquement les lignes ajoutées



Le 20/09/2017 17:25, Yves Rutschle a écrit :
On Wed, Sep 20, 2017 at 04:48:43PM +0200, Migrec wrote:
J'ai un fichier CSV avec des identifiants, des mots de passes et quelques
autres données.
C'est mal, il faut hacher les mots de passe.

Malheureusement, ce n'est pas moi qui produit le fichier...

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...
En Perl, avec un tableau associatif indexé par adresse mail,
par ex. avec des fichiers:

toto:tata:foo@bar.com:0:2


# Lire et indexer le premier fichier
my %lines;
foreach (<$file1>) {
    my ($f1, $f2, $email, $f3, $f4) = split /:/;
    $lines{$email} = 1;
}

# Imprimer ce qui n'est pas dans le premier fichier
foreach (<$file2>) {
    my ($f1, $f2, $email, $f3, $f4) = split /:/;
    print unless exists $lines{$email};
}


Je ne connais pas du tout le perl (et du coup pas tout compris...) mais j'ai réussi à bricoler un peu pour avoir un résultat qui me parait satisfaisant.
Merci beaucoup.

 Le script :
#!/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: $!";


 # Lire et indexer le premier fichier
my %lines;
foreach (<$old>) {
   my ($f1, $f2, $f3, $email, $f4, $f5, $f6, $f7,$f8) = split /;/;
   $lines{$email} = 1;
}

# Imprimer ce qui n'est pas dans le premier fichier
foreach (<$new>) {
   my ($f1, $f2, $f3, $email, $f4, $f5, $f6, $f7,$f8) = split /;/;

print unless exists $lines{$email};
}


Reply to: