Thread CSV Vergleich (21 answers)
Opened by gnude at 2011-10-25 13:18

gnude
 2011-11-07 08:48
#153965 #153965
User since
2011-10-05
17 Artikel
BenutzerIn
[Homepage] [default_avatar]
Gerne,
im Moment sieht es so aus:
Das Script vergleicht zwei Dateien (CSV Dateien) und vereinfacht gesagt, werden diese zusammengeführt.
Durchlaufe Datei xt_customers.txt Zeilenweise und wenn
Feld 0 in beiden Dateien gleich ist, geben die Zeile von der xt_customers.csv aus,
dann vergleiche xt_customers.csv Zeilenweise und wenn Zusätzliche Zeilen vorhanden sind, gebe diese aus.
Nun fehlt folgende Funktion:
Beim Zeilenweise einlesen der xt_customers.txt muss es so aussehen:
Vergleiche Zeilenweise Feld 0,
wenn Feld 0 in beiden Dateien gleich, gebe Zeile aus der .csv Datei aus.
Wenn Feld 0 nicht gleich, dann vergleiche Feld 6 (eMAil.)
Wenn eMail gleich ist dann nehme Feld 0 von der .txt Datei und die restlichen Felder von der .csv Datei.

Hab ich das jetzt gut erklärt???


Hier nochmal das Script:


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
$Data::Dumper::Useqq = 1;

#!/usr/bin/perl
#use strict;
use warnings;
use Text::CSV;

my %datei = (
shop => 'xt_customers.csv',
wawi => 'xt_customers.txt',
neu => 'all_customers.csv',
);
sub load_cache {
my $file = shift;
my %cache;
my $csv = Text::CSV->new ( { binary => 1 , sep_char => ";" } )
or die "File not found: ".Text::CSV->error_diag ();
my $row;
open my $fh, "<:encoding(iso-8859-1)", $file or die $file." $!";
while ( $row = $csv->getline ( $fh ) and ref $row eq 'ARRAY') {
$cache{'ID'}{ $row->[0] } = $cache{'Mail'}{ $row->[6] } = $row;
#$cache{'ID'}{@$row[0]} = $cache{'Mail'}{@$row[6]} = $row;
}
return \%cache;
}
# lade beide dateien
my $cache_shop = load_cache( $datei{'shop'} );
my $cache_wawi = load_cache( $datei{'wawi'} );
my $cache_neu = (load_cache $datei{shop} )->{ID};
# kopiere alle zeilen aus wawi in neuen shop deren id oder mail nicht im shop ist
for my $ID ( keys %{ $cache_wawi->{'ID'} }) {
$cache_neu->{ $ID } = $cache_wawi->{'ID'}->{ $ID }
if not exists $cache_shop->{'ID'}->{ $ID }
and not exists $cache_shop->{'Mail'}->{ $cache_wawi->{'ID'}->{$ID}->[6] };
# and not exists $cache_shop->{'Mail'}->{ $cache_wawi->{'ID'}->{$ID}->[6] };
}
# gib die neue shopliste aus
for my $row ( values %$cache_neu ) { print join(';', @$row[0..17]);print"\n" }
===========
Debian User
===========

View full thread CSV Vergleich