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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!