Thread Probleme mit dem Speichern von Dateinamen (8 answers)
Opened by Timo_81 at 2007-01-20 17:58

topeg
 2007-01-20 20:18
#73397 #73397
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das der Code speichert alle Sätze, auch jene die doppelt vorkommen, mit jeweils einer eigenen IDNummer. Du bräuchtest noch ein übergeordnetes Array, in dem alle Sätze drinstehen, die schon gelesen wurden. Das array müßtest du bei jedem Weiteren Satz durchgehen und schauen, ob der Neue Satz schonmal da war.
Dann bräuchtest du noch ein Array in dem Die ganzen Dateinamen (in einem untergordenten Array oder als Stringliste) zu den dazugehörigen IDs aufgelistet sind, du kannst ja nicht vorher wissen in welcher Datei welcher Satz auftaucht. Erst zum Schluss wenn du alle Dateien geparst hast, kannst du die Dateien "out.txt" und "verweis.txt" schreiben.
Wenn du allso deinen Ansatz weiterverfolgst wird das genze sehr viel komplizierter, als wenn du einen Hash benutzt.

Aber man kann es so machen, wie du Angefangen hast:

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
my @alle_saetze;
my @dateien;
for my $file (@textdateien)  
{
  local $/='';
  open(DAT, '<',$file) or die "'$file' $!\n";
  # Datei ganz einlesen (siehe oben $/)
  # und Zeilenumrüche entfernen
  # (Habe ich bei meinem Beispiel vergessen :-/ )
  (my $data=<DAT>)=~s/[\r\n]+//gs;
  close(DAT);
  my @saetze = split/(?<=[\.!?])\s*/, $data; #Filtert Sätze raus
  for my $satz (@saetze)
  {
    # nach dem Satz im Array @alle_saetze suchen
     my $pos=0;
     $pos++ while($alle_saetze[$pos] ne $satz && $pos<@alle_saetze);
    # kein gleicher Satz gefunden,
    # da die Schleife alle Sätze durchgegangen ist.
    if( $pos == @alle_saetze);
    {
      push(@alle_saetze,$satz);
      push(@dateien,[$file]);
    }
    # Den Satz gibt es schon.
    else
    {  push(@$dateien[$pos],$file);  }
  }
}

# Die Ausgabedatei
open(DATEI, '>', 'out.txt') or die 'out.txt: $!\n';
print "$i:$alle_saetze[$i]\n" for my $i (0..$#alle_saetze);
close(DATEI);

#Enthält die ID und die Dateinamen
open DATEI ,'>', 'verweis.txt' or die 'verweis.txt: $!\n';
print "$i:".join(',',@$dateien[$i])."\n" for my $i (0..$#dateien);
close DATEI;


Du must doch zugeben, das die Variante über einen Hash doch etwas eleganter ist. :-)

View full thread Probleme mit dem Speichern von Dateinamen