Schrift
[thread]5952[/thread]

2 .txt-Dateien miteinander vergleichen

Leser: 2


<< >> 9 Einträge, 1 Seite
Arasiel
 2003-12-05 16:46
#74614 #74614
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Hallo,

ist es möglich in Perl 2 Textdateien miteinander zu vergleichen und diejenigen Einträge aus beiden Dateien zu entfernen die gleich sind?
Wenn ja, dauert es lange? Die Dateien haben jeweils ca. 16.000 Zeilen und sind jeweils ca. 3 bis 4 MB gross.

Vielen Dank im Voraus für die Hilfe!

Mfg,

Markus
ptk
 2003-12-05 17:01
#74615 #74615
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Arasiel,05.Dec..2003, 15:46]Hallo,

ist es möglich in Perl 2 Textdateien miteinander zu vergleichen und diejenigen Einträge aus beiden Dateien zu entfernen die gleich sind?
[/quote]
Ja.
Quote
Wenn ja, dauert es lange?

Nein
Quote
Die Dateien haben jeweils ca. 16.000 Zeilen und sind jeweils ca. 3 bis 4 MB gross.

Vielen Dank im Voraus für die Hilfe!

Mfg,

Markus

Wenn "gleiche Eintraege" sich auf Zeilen beziehen und die Sortierung egal ist, wuerde ich einfach sort und uniq auf der Kommandozeile nehmen:
Code: (dl )
sort file1 file2 | uniq -u
Arasiel
 2003-12-05 17:11
#74616 #74616
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Ich möchte das Ergebnis aber wieder in eine extra Textdatei (ergebnis.txt).
Der Aufbau sollte so sein:
*File1
übriggebliebene Zeilen (die nicht in File 2 vorhanden sind)

*File2
übriggebliebene Zeilen (die nicht in File 1 vorhanden sind)
ptk
 2003-12-05 17:31
#74617 #74617
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Eine Perl-Loesung koennte so aussehen: alle Zeilen von File2 in ein Hash einlesen wobei der Key jeweils die Zeile und der Value egal ist. Dann ueber File1 iterieren und alle Zeilen herausschmeissen, fuer die
Code: (dl )
exists $file2{$zeile}
wahr ist.
Strat
 2003-12-05 17:52
#74618 #74618
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn die Dateien 3-4 MB gross sind, sollte man die vielleicht nicht 1:1 in den RAM einlesen... da faellt mir folgende Idee ein:
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
use warnings;
use strict;
use Tie::File;

tie (my @file1, 'Tie::File', $filename1) or die $!;
tie (my @file2, 'Tie::File', $filename2) or die $!;

# sortieren
@file1 = sort(@file1);
@file2 = sort(@file2);

open (OUT, ">$outfile") or die $!;

my $i = 0; my $j = 0; # indices fuer file1, file2
while ($file1[$i] or $file2[$j]) {

 # absicherung fuers ende
 unless (defined $file1[$i]) {
   print OUT $file1[$j]; $j++; next;
 } # unless
 unless (defined $file2[$j]) {
   print OUT $file2[$i++]; next;
 } # unless

 # vergleiche zwei Zeilen
 my $compare = $file1[$i] cmp $file2[$j];

 if ($compare < 0) { # file1 ist kleiner
   print OUT $file1[$i++];
 }
 elsif ($compare > 0) { # file2 ist kleiner
   print OUT $file2[$j++];
 }
 else { # gleich gross
   $i++; $j++;
 }

} # while

close (OUT);
untie(@file1);
untie(@file2);
\n\n

<!--EDIT|Strat|1070639604-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Arasiel
 2003-12-05 19:15
#74619 #74619
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für die Hilfe!
Ich werds sobald als möglich ausprobieren!

Gruss
ptk
 2003-12-05 19:28
#74620 #74620
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Strat,05.Dec..2003, 16:52]wenn die Dateien 3-4 MB gross sind, sollte man die vielleicht nicht 1:1 in den RAM einlesen...
[/quote]

Das ist ja nicht besonders viel, auch wenn bei Perl vielleicht doppelt so viel Speicher durch den Overhead eines SV* verbraucht wird.

Quote
da faellt mir folgende Idee ein:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
use warnings;
use strict;
use Tie::File;

tie (my @file1, 'Tie::File', $filename1) or die $!;
tie (my @file2, 'Tie::File', $filename2) or die $!;

# sortieren
@file1 = sort(@file1);
@file2 = sort(@file2);


Ich bezweifle, dass Tie::File das performant durchfuehren kann.
Im Zweifelsfall ist es besser, die Sortierung im Speicher vorzunehmen
oder eine andere Datenstruktur zu waehlen, z.B. einen Btree mittels DB_File.

Quote
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
open (OUT, ">$outfile") or die $!;

my $i = 0; my $j = 0; # indices fuer file1, file2
while ($file1[$i] or $file2[$j]) {

# absicherung fuers ende
unless (defined $file1[$i]) {
print OUT $file1[$j]; $j++; next;
} # unless
unless (defined $file2[$j]) {
print OUT $file2[$i++]; next;
} # unless

# vergleiche zwei Zeilen
my $compare = $file1[$i] cmp $file2[$j];

if ($compare < 0) { # file1 ist kleiner
print OUT $file1[$i++];
}
elsif ($compare > 0) { # file2 ist kleiner
print OUT $file2[$j++];
}
else { # gleich gross
$i++; $j++;
}

} # while

close (OUT);
untie(@file1);
untie(@file2);
Strat
 2003-12-05 20:30
#74621 #74621
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=ptk,05.12.2003, 18:28][quote=Strat,05.Dec..2003, 16:52]wenn die Dateien 3-4 MB gross sind, sollte man die vielleicht nicht 1:1 in den RAM einlesen...
[/quote]

Das ist ja nicht besonders viel, auch wenn bei Perl vielleicht doppelt so viel Speicher durch den Overhead eines SV* verbraucht wird.[/quote]
klar, aber das problem, das ich sehe ist, dass die daten immer groesser und groesser werden; und falls es ein wegwerf-script ist, ist halt die gefahr sehr gross, dass es doch irgendwie ueberlebt, einfach deshalb, weil es funktioniert, und vielleicht auch fuer andere aehnliche probleme verwendet werden kann (sowas ist mir schon zu oft passiert; deshalb schreibe ich bei Kunden keine Wegwerfscripte mehr (oder zumindest meinen Namen nicht rein))

privat haette ich die sortierung wahrscheinlich mittels dem betriebssystem-sort gemacht. Das ist zwar nicht besonders plattformunabhaengig, dafuer aber sehr schnell.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
havi
 2003-12-09 09:15
#74622 #74622
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Ich hab vor kurzen hier im Forum mal dazu ein kleines Skript gepostet - such doch einfach mal nach Vergleich oder so...
<< >> 9 Einträge, 1 Seite



View all threads created 2003-12-05 16:46.