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;

    // und hier hast du in SplitValues jetzt die Liste der Einträge in der Zeile drin

  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

user profile iconFairys hat folgendes geschrieben Zum zitierten Posting springen:
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. ;-)

user profile iconFairys hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconFairys hat folgendes geschrieben Zum zitierten Posting springen:

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.


jaenicke - Do 23.06.11 17:15

Was den Debugger angeht, findest du hier noch Anleitungen dazu, denn der kann noch sehr viel mehr. ;-)
http://wiki.delphigl.com/index.php/Tutorial_Debugging
http://www.delphi-treff.de/ueber-delphi/entwicklungsumgebung-bis-delphi-7/debugger/