Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Explode


Borlox - Mo 04.11.02 19:54
Titel: Explode
Hi Leute,

ich habe eine Textdatei in der alle Wörter mit einem | getrennt sind und nun möchte ich diese Wörter in ein Array oder änliches schreiben, wie mache ich das am besten?
Ich habe mal etwas von dem Befehl explode gehört, aber leider nicht das richtige im Forum gefunden!
Gibt es nicht einfach einen Befehl der so lautete?

Testvariable:=explode(TextausDatei, '|');

????????
Danke


Ex0rzist - Mo 04.11.02 20:00

Hallo Borlox,

ich empfehle dir, das | durch ein "," zu ersetzen (Stichwort: StringReplace).
Anschließend kannst du dann CommaText verwenden.


DelphiMan - Mo 04.11.02 20:57
Titel: Ein Lösungsvorschlag...
Hi Borlox!

Der Befehl Explode sagt mir nichts - jedenfalls nicht im Zshg. mit Delphi.
Da ich grad mal Lust hatte, hab ich dein Problem soeben gelöst. Dabei verwende ich einen dynamischen Array in welchen ich Wort für Wort einlese. Hier erstmal eine mögliche Lösung zu deinem Problem:


Quelltext
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:
procedure TForm1.Button1Click(Sender: TObject);
var woerter: array of string;
    infile: Textfile;
    pfad, zeile: string;
    i: integer;
begin
  pfad := ExtractFilePath(Application.ExeName)+'test.txt';
  AssignFile(infile, pfad);
  {$I-}
  reset(infile);
  while not eof(infile) do
    begin
      readln(infile, zeile);
      while (Length(zeile) > 0) do
        begin
          SetLength(woerter, Length(woerter)+1);
          if pos('|',zeile) = 0 then
            begin
              woerter[High(woerter)] := zeile;
              zeile := '';
            end
          else
            begin
              woerter[High(woerter)] := copy(zeile, 1, pos('|', zeile)-1);
              Delete(zeile, 1, pos('|',zeile));
            end;
        end;
      Next;
    end;
  {$I+}
  if IOResult <> 0 then Showmessage('Fehler aufgetreten!')
  else CloseFile(infile);

  for i := 0 to High(woerter) do
    Showmessage(woerter[i]);

  woerter := nil;  // Speicher freigeben
end;



So... zunächst stelle ich den Datenkanal zwischen Dateivariable und externer Datei her. Daraufhin wird die Datei mittels Reset und while not eof.. Zeile für Zeile ausgelesen. Der Zeileninhalt einer jeden Zeile wird dabei zunächst in die Variable 'zeile' geschrieben und daraufhin wird dieser String geparsed. Für jedes neue Wort wird der Speicherbereich des dynamischen Arrays erhöht. So das ist prinzipiell alles.
Am Schluss sollte man immer noch die Variable eines dynamischen Arrays auf nil setzen.
Für deine speziellen Bedürfnisse musst du diese Prozedur wahrscheinlich noch etwas abändern. Steht in einer Zeile der Datei bspw. '||' werden zwei Leerwörter gespeichert. Wie gesagt, dass musst du eben an deine Bedürfnisse anpassen...

MfG
DelphiMan


Christian S. - Mo 04.11.02 21:13

Hi!

Um ExOrzists Idee mal auszuführen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
VAR liste : TStringList;
    datei : Textfile;
    text, lesen : String;
begin
  liste:=TStringList.Create;
  AssignFile(datei,'c:\test.txt');
  Reset(datei);
  text:='';
  lesen:='';
  while not eof(datei) do
  begin
    Readln(datei,lesen);
    if (lesen <>'') and (text<>'') then text:=text+'|';
    text:=text+lesen;
  end;
  CloseFile(datei);
  text:=StringReplace(text,'|',',',[rfReplaceAll]);
  liste.CommaText:=text;
  liste.Free;
end;


In liste.Items hast Du jetzt Deine Wörter. Ich gehe dabei davon aus, dass am Anfang einer Zeile kein '|' steht, ich es also noch hinzufügen muss.

MfG,
Peter

P.S.: Die Dateioperation sollte natürlich noch mit {$I-} und {$I+} abgesichert werden.