Entwickler-Ecke
Dateizugriff - txt Datei: Zeilen auslesen und in Variablen speichern
Fairys - Sa 18.06.11 17:40
Titel: txt Datei: Zeilen auslesen und in Variablen speichern
Hi,
Ich muss für Informatik (was ich allerdings bereits wieder abgewählt habe weil es mir echt nicht liegt...) etwas programmieren, und hänge leider schon gleich am Anfang :( Vielleicht kann mir hier jemand helfen?
Ich hab eine Textdatei. Die erste Zeile lese ich aus mit Readln und übertrage das in einen String.
Jetzt will ich diesen String wieder aufsplitten in verschiedene Variablen, das Trennzeichen ist z.B '&'.
Wie schaff ich das, ohne dass die Leerzeichen auch als Trennzeichen angesehen werden?
Alternativ könnte ich natürlich gleich die Variablen aus der Textdatei gleich auslesen lassen (bis zum Trennzeichen eben).
Hat jemand einen Lösungsvorschlag?
Grüße
jaenicke - Sa 18.06.11 17:46
Hallo und :welcome:
Die normale Lösung wäre Pos und Copy usw. zu benutzen.
Die einfache Lösung mit etwas Overhead:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var SplitValues: TStringList; begin SplitValues := TStringList.Create; try SplitValues.Delimiter := '&'; SplitValues.StrictDelimiter := True; SplitValues.DelimitedText := YourCurrentLine;
finally SplitValues.Free; end; end; |
Fairys - Sa 18.06.11 18:44
Hui, danke für die schnelle Antwort!
Leider nutzt meine Schule (und ich) Delphi 7, ich glaube daran liegt es?
Es kommt die Fehlermeldung: "Undefinierter Bezeichner: 'StrictDelimiter'"
Edit: Hab ne vorrübergehende Lösung, ich setzt die einzelnen Variablen in Anführungszeichen!
Wenn jemand noch ne bessere hat, gerne *g*
Gerd Kayser - Sa 18.06.11 19:09
Hat die Textdatei einen festen Spaltenaufbau?
jaenicke - Sa 18.06.11 20:19
Fairys hat folgendes geschrieben : |
Leider nutzt meine Schule (und ich) Delphi 7, ich glaube daran liegt es?
Es kommt die Fehlermeldung: "Undefinierter Bezeichner: 'StrictDelimiter'" |
Richtig, das gibt es erst seit Delphi 2005 oder Delphi 2006.
Für solche Fälle wäre es sinnvoll in deine Profileinstellungen zu schreiben welche Delphiversion du benutzt, dann hätte ich das gar nicht erst vorgeschlagen. ;-)
Fairys hat folgendes geschrieben : |
Wenn jemand noch ne bessere hat, gerne *g* |
Selbst machen. ;-)
Mit Pos bekommst du die Position des jeweils nächsten Trennzeichens, mit Copy kannst du den Wert davor herauskopieren und mit Delete den bearbeiteten Teil des Strings löschen. Das wiederholst du bis dein String leer ist, fertig. ;-)
Gerd Kayser - Sa 18.06.11 20:29
jaenicke hat folgendes geschrieben : |
Mit Pos bekommst du die Position des jeweils nächsten Trennzeichens, [...] |
Bei einem festen Spaltenaufbau wäre sicherlich TFileStream in Verbindung mit Records eine komfortable Variante.
Fairys - Do 23.06.11 16:31
Also ich bin jetzt einfach bei der Variante mit den Anführungszeichen geblieben, klappt eigentlich super.
Nur jetzt hab ich ein anderes Problem ...
Will in eine Listbox die Zeilen anzeigen lassen, aber es will nicht so ganz
Delphi-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:
| procedure TForm2.Button5Click(Sender: TObject); Var F: TextFile; Count2: Integer; nummer, zeile, Y: string; Split: TStringList; begin
ListBox1.Visible := true; ListBox1.Clear;
Count2 := 0; nummer := combobox1.Text;
AssignFile(F, 'frage'+nummer+'.txt'); FileMode := fmOpenRead; Reset(F); Split := TStringList.Create; Split.Delimiter := '&'; Split.DelimitedText := Y;
While not EoF(F) do Begin
Inc(Count2); ReadLn(F, Y); Listbox1.items.add(Split[1]);
End; CloseFile(F);
label2.caption := 'Es sind '+inttostr(Count2)+' Fragen der Schwierigkeitsstufe '+nummer+' vorhanden.';
end; |
Fehlermeldung: Listenindex überschreitet das Maximum (1)
Es hat auf alle Fälle was mit der TStringList zu tun, aber ich weiß nicht genau was :/
jasocul - Do 23.06.11 16:38
Wegen Unsinn wieder gelöscht
jaenicke - Do 23.06.11 16:48
Fairys hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Split := TStringList.Create; Split.Delimiter := '&'; Split.DelimitedText := Y;
While not EoF(F) do Begin
Inc(Count2); ReadLn(F, Y); Listbox1.items.add(Split[1]); | |
Im Debugger hättest du sehen können, dass Y leer oder mit Blödsinn gefüllt ist. (Haltepunkt mit F5 setzen und dann Maus über Y halten, wenn das Programm da ankommt.)
Du solltest außerdem eine Compilerwarnung haben, dass Y evtl. nicht initialisiert ist.
Denn du weist Y zuerst an DelimitedText zu und liest es erst danach aus.
Wenn du aber Compilerwarnungen einfach ignorierst... :roll:
(Und nebenbei ist die Quelltext"formatierung"... :puke:)
Fairys - Do 23.06.11 17:12
Danke für deine Hilfe, jetzt funktionierts :)
Werd mir das mit dem Debugger merken, wusste ich gar nicht.
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!