Thread Dateien durchsuchen (29 answers)
Opened by Paul at 2013-01-30 21:28

topeg
 2013-01-31 19:57
#165371 #165371
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Soweit ich es verstanden habe:
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
27
28
29
30
31
32
33
34
35
#!/usr/bin/perl
use strict;
use warnings;

my $OUTPATH='';
my $A='';
my $B='';
my $C='';


open(my $temp_fh, '<', "$OUTPATH/$B") or die("Can't open $B ($!)\n");
my @referenz=<$temp_fh>;
close($temp_fh);

open(my $out_fh, '>', "$OUTPATH/$C") or die("Can't open $C ($!)\n");
open(my $in_fh,  '<', "$OUTPATH/$A") or die("Can't open $A ($!)\n");
MAINLOOP:
while(my $line = <$in_fh>)
{
  my $value=substr($line,0,20);
  $value+=0;
  
  for my $ref_line (@referenz)
  {
    if($ref_line =~ /$value/)
    {
      print $out_fh $ref_line;
      next MAINLOOP;
    }
  }
  
  print $out_fh $line;
}
close($in_fh);
close($out_fh);


Merke dir:
- Führe eine 'teure' Aktion möglichst nur einmal aus.
- Mach so wenig wie möglich.
- Speichere so wenig wie möglich, aber so viel wie nötig.

Nach den Prämissen:

  • Lese den Inhalt von Datei B in das Array @referenz
  • Öffne Datei C zum Schreiben
  • Öffne Datei A zum Lesen
  • Durchlaufe die Hauptschleife solange noch Zeilen zu lesen sind:
    • Lese eine Zeile aus Datei A
    • Nimm die ersten 20 Byte als Zahl
    • Gehe das Array @referenz durch
      • Wenn die Zahl in ein einem Eintrag gefunden wurde Schreibe diese Zeile in Datei C
      • Mach den nächsten Durchlauf der Hauptschleife
    • Schreibe die Zeile aus Datei A in C
    • Mach den nächsten Durchlauf der Hauptschleife
  • schließe alle offenen Dateien


Das kann man noch beschleunigen:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/perl
use strict;
use warnings;

my $OUTPATH='';
my $A='';
my $B='';
my $C='';

my %index;
open(my $temp_fh, '<', "$OUTPATH/$B") or die("Can't open $B ($!)\n");
MAINLOOP:
while(my $line=<$temp_fh>)
{
  while($line=~/(\d+)/gc)
  {
    my $value=$1;
    $value+=0;
    next if(exists($index{$value}));
    $index{$value}=$line;
    next MAINLOOP;
  }
}
close($temp_fh);

open(my $out_fh, '>', "$OUTPATH/$C") or die("Can't open $C ($!)\n");
open(my $in_fh,  '<', "$OUTPATH/$A") or die("Can't open $A ($!)\n");
while(my $line = <$in_fh>)
{
  my $value=substr($line,0,20);
  $value+=0;
  
  if(exists($index{$value}))
  {
    print $out_fh $index{$value};
    next;
  }
  
  print $out_fh $line;
}
close($in_fh);
close($out_fh);


Ich erzeuge einen Index mit der Zuordnung 'Zahl' => 'Zeile' Das benutze ich dann um die heraus gelesenen Zahlen zu vergleichen. Das funktioniert aber nur wenn es Integerzahlen und keine Fließkommazahlen sind. Aber auch dafür gäbe es Lösung, dazu müsste ich aber genauer wissen, um welche Werte es sich handelt.
Last edited: 2013-01-31 19:58:55 +0100 (CET)

View full thread Dateien durchsuchen