Schrift
[thread]11811[/thread]

Dateien vergleichen

Leser: 2


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
havi
 2008-05-15 13:01
#109736 #109736
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Hallo Leute!

Ich habe zwei Dateien mit ca. 140 Feldern (tab-getrennt).

Ich muss die beiden Dateien bzw. die Felder 1 bis 126 miteinander vergleichen.

Die ganze Zeile der zweiten Datei soll ausgegeben werden, wenn das Feld 2
der ersten Datei mit Feld 2 der zweiten Datei ident ist, aber Feld 1 oder Feld 3 bis 126 irgendwas anders ist.

Dateien sind jeweils 3 GB gross...

Vielen Dank fuer eure Hilfe!

LG,
havi
moritz
 2008-05-15 14:02
#109739 #109739
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Sollen die Dateien zeilenweise verglichen werden? Oder soll in der zweiten Tabelle nach dem Datensatz aus der ersten gesucht werden?
havi
 2008-05-15 14:19
#109741 #109741
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
hier mein Ansatz...

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
#!/usr/bin/perl

use warnings;
use strict;

open(EIN, "<test.csv") or die $!;

my %pnr;

while(<EIN>) {
chomp;
my @f = split(/;/);
$pnr{join("", @f[0..126])} = 1;
} # while
close(EIN) or die $!;

open(EIN, "<testNEU.csv") or die $!;
open(AUS, ">NEU.txt") or die $!;

while(<EIN>) {
chomp;
my @satz = split(/;/);
my $vergleich = join("", @satz[0..126]);
print AUS $_."\n" if not defined $pnr{$vergleich};
} # while

close(EIN) or die $!;
close(AUS) or die $!;

print "Fertig.\n";

1;


Problem - ich gehe nicht auf Feld 2 ein...
Vergleich: Jede Zeile mit jeder Zeile...

Weiters, hab ich vorher nicht geschrieben, soll festgestellt werden,
wenn eine Zeile in der zweiten Datei vorhanden ist, nicht aber in der Ersten,
soll diese auch ausgegeben werden. Genauso umgekehrt, ist eine Zeile in der
ersten Datei vorhanden, nicht aber in der Zweiten -> ebenfalls ausgeben!
moritz
 2008-05-15 14:23
#109742 #109742
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
havi+2008-05-15 12:19:12--
Vergleich: Jede Zeile mit jeder Zeile...


Das wird so nichts, wenn beide Dateien 3 GB groß sind. So was ist Aufgabe einer Datenbank. Lade die Daten in eine Datenbank und lege ein Index über das Feld an, das verglichen werden soll.

Dann kannst du mit ein bisschen SQL die Abfragen machen die du willst.
havi
 2008-05-15 14:25
#109743 #109743
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Soll eine Perlloesung sein...
renee
 2008-05-15 14:41
#109744 #109744
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
DBD::CSV
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
moritz
 2008-05-15 15:14
#109745 #109745
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
havi+2008-05-15 12:25:18--
Soll eine Perlloesung sein...


Dann greifst du halt von Perl aus auf die Datenbank zu - wofür gibst denn CPAN:DBI? ;-)

@Renee erzeugt DBD::CSV denn einen Index? Wenn nicht wird das grauenhaft langsam. 6GB Daten werden wohl kaum in den Arbeitsspeicher passen...
renee
 2008-05-15 15:28
#109746 #109746
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
moritz+2008-05-15 13:14:24--
@Renee erzeugt DBD::CSV denn einen Index? Wenn nicht wird das grauenhaft langsam. 6GB Daten werden wohl kaum in den Arbeitsspeicher passen...


Ich habe mir das Modul noch nicht genauer angeschaut, aber (relativ) langsam ist es schon...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-05-15 22:25
#109756 #109756
Versuch mal csvdiff, ist in Perl geschrieben, und genau dafür da.
moritz
 2008-05-15 23:37
#109759 #109759
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2008-05-15 20:25:44--
Versuch mal csvdiff, ist in Perl geschrieben, und genau dafür da.


Also csvdiff ist mir schon noch den ersten paar Codezeilen suspekt:

Code (perl): (dl )
1
2
3
4
5
6
#Pruefen ob die benoetigten Module installiert sind, wenn ja landen, wenn nein
#sterben ;-}
#Es sind zwar durchweg Standard Module, aber sicher ist sicher
eval "require Getopt::Std;";
die "Modul Getopt::Std not installed\n" if $@;
use Getopt::Std;


Aber ich will niemanden von seinem Glück abhalten ;)
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2008-05-15 13:01.