Autor Beitrag
Borlox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 191

Win XP
Delphi 6 Enterprise
BeitragVerfasst: Mo 04.11.02 19:54 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: 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.

_________________
If accidentally read, induce vomitting.
DelphiMan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 73



BeitragVerfasst: 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:

ausblenden volle Höhe 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 04.11.02 21:13 
Hi!

Um ExOrzists Idee mal auszuführen:

ausblenden 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".