Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Array mit Textdatei "füllen"


DaKrissX84 - Do 13.03.03 23:48
Titel: Array mit Textdatei "füllen"
Hallo!

Mein Programm soll ein array (of string) mit einzelnen Wörtern füllen.

Die Wörter befinden sich in einer Textdatei (C:\Beispiel.txt) getrennt durch ein ';'. Damit das Programm erkennt, dass es keine weiteren Wörter mehr ins Array schreiben soll, ist ein ']' am Ende der "Wörerkette".

Es sollen also einzelne Wörter erkannt und Stück für Stück in das Array geschrieben werden.

Hat jemand ne bessere Idee als das?:

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:
str1 := TStringlist.Create;
  str1.Loadfromfile('C:\Beispiel.txt');
  inhalt := str1.text;
  str1.free;
//Um die Textdatei auszulesen

repeat
    
    i := 0;
        repeat
                begin
                wort := wort+inhalt[p];
                p:= p+1;
                i:= i+1;
                end
        until
        wort[i] = ';';

   delete(wort,length(wort),1);
   a := a+1;
   Array[a] := wort;

until
inhalt[p] = ']';

Hoffe, man versteht was ich meine....

Noch ein Problem:
Wenn ich den obigen Code benutze, dann wird das Array an manchen stellen mit ' ' (also quazi nix) gefüllt. Das liegt irgendwie am Zeielenumbruch in der Textdatei... Kann man das auch noch irgendwie verhindern?

Dank im Voraus!


mars - Fr 14.03.03 00:20

Ich würde allgemein mit einer TStringList weiterarbeiten (statt dem Array). Sonst weiss ich auch nicht viel zu verbessern, ist ein dummes Format (Ich hoffe nicht, dass du diese Datei selber erstellt hast!! :wink: )


DaKrissX84 - Fr 14.03.03 11:52

Hi!

Ich habe die Datei schon selbst erstellt...

1.Frage:
Wie kann man das denn sonst machen, als die Wörter durch irgendein bestimmtes Zeichen, z.B. ';' zu trennen??

2. Frage:
Wie arbeitet man mit Stringlists?


Delete - Fr 14.03.03 12:45

Wie so ist das ein dummes Format? Das ist eine ganz normale CSV-Datei mit Semikola als Trennzeichen.

Mit der Methode CommaText von TStringlist bekommst du es relativ einfach in eine Stringliste.

Willst du es in ein Array schreiben versuch mal das:

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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
{-----------------------------------------------------------------------------
  Procedure : Explode
  Purpose   : Seperates a CSV-line
  Arguments : const Separator, S: string; Limit: Integer = 0
  Result    : TStringDynArray
-----------------------------------------------------------------------------}

type
  TStringDynArray = array of string;

function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
var
  SepLen: Integer;
  F, P: PChar;
  ALen, Index: Integer;
begin
  SetLength(Result, 0);
  if (S = ''or (Limit < 0then Exit;
  if Separator = '' then
  begin
    SetLength(Result, 1);
    Result[0] := S;
    Exit;
  end;
  SepLen := Length(Separator);
  ALen := Limit;
  SetLength(Result, ALen);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := StrPos(P, PChar(Separator));
    if (P = nilor ((Limit > 0and (Index = Limit - 1)) then P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5); // mehrere auf einmal um schneller arbeiten zu können
      SetLength(Result, ALen);
    end;
    SetString(Result[Index], F, P - F);
    Inc(Index);
    if P^ <> #0 then Inc(P, SepLen);
  end;
  if Index < ALen then SetLength(Result, Index); // wirkliche Länge festlegen
end;