Schrift
[thread]11362[/thread]

Dateien miteinander vergleichen über Hash`s ?

Leser: 1


<< >> 3 Einträge, 1 Seite
tecker
 2008-02-26 14:27
#106350 #106350
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

habe folgendes Problem. Ich möchte 2 (und mehr) Dateien der Form
("Zähler : URL"):

file1:
49837 : www.immobilienscout24.de
37188 : img.ui-portal.de
36169 : images.gmx.net
32470 : img.web.de
[...]

file2:
49837 : www.immobilienscout24.de
37188 : img.ui-portal.de
36169 : images.gmx.net
32470 : img.web.de
[...]

zeilenweise miteinander vergleichen (habe bewusste 2x den gleichen Inhalt gewählt da Prinzip das gleiche ist). Ich will bei Übereinstimmung der URLs, die Zähler addieren und in eine neue Datei file3 schreiben.

Meine Variante (die wohl auch uneffizient ist) erzeugt foglendes:
file3:
99674 : www.immobilienscout24.de
74376 : img.ui-portal.de
74376 : img.ui-portal.de
74376 : img.ui-portal.de
[...]

.... jeder Eintrag (bis auf der 1.) kommt so oft, wie Zeilen in file2 sind. Jemand eine Idee wie man das alles besser oder ggf. mit Hash`s lösen kann??

Wäre sehr dankbar falls mir jmd. weiterhelfen kann.

VG

Hier mein Versuch:

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

open(AUF1, "<output.0.dat");
@lines1=<AUF1>;
close(AUF1);

open(AUF2, "<output.1.dat");
@lines2=<AUF2>;
close(AUF2);

open(AUF3, ">new.output.dat");

foreach $line1 (@lines1)
{
#RegEx auf 1. Zeile und speichern von Zaehler in $line_count und URL in $line_url

$line1 =~ /(\d+)\s:\s([a-zA-Z0-9\.\-]+)/g;

$line1_count = $1;
$line1_url = $2;

foreach $line2 (@lines2)
{

$line2 =~ /(\d+)\s:\s([a-zA-Z0-9\.\-]+)/g;

$line2_count = $1;
$line2_url = $2;

if ($line1_url eq $line2_url)
{
$new_count=($line1_count+$line2_count);
print AUF3 "$new_count : $line1_url\n";
}
}

}
close(AUF3);
renee
 2008-02-26 14:43
#106351 #106351
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (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
#!/usr/bin/perl

use strict;
use warnings;

my $file1 = '/pfad/datei1.txt';
my $file2 = '/pfad/dat2.txt';
my $file3 = '/pfad/dat3.txt';

my %hash;

for my $file( $file1, $file2 ){
    open my $in, '<', $file or die $!;
    while( my $line = <$in> ){
        chomp $line;
        my ($count,$url) = split /\s*:\s*/, $line;
        $hash{$url} += $count;
    }
    close $in;
}

open my $out, '>', $file3 or die $!;
for my $key ( keys %hash ){
    print $out $hash{$key},": ", $key, "\n" or die $!;
}
close $out or die $!;
(ungetestet)
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/
tecker
 2008-02-26 15:08
#106357 #106357
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nicht übel!!

Vielen Dank renee. Ist so ziemlich genau das was ich wollte und vor allem so schnell ... die Ausführung kommt ja in weniger als 1sek und es handelt sich um je eine Datei mit rund 14000 Zeilen.

Hab noch ein "sort {$Hash{$b} <=> $Hash{$a}}" in Zeile 23 mit eingebaut um absteigend nach Häufigkeit zu sortieren.

Grüße
<< >> 3 Einträge, 1 Seite



View all threads created 2008-02-26 14:27.