Entwickler-Ecke

Dateizugriff - Textdatei bis zu einem bestimmten Punkt auslesen


Delete - So 22.06.03 12:17
Titel: Textdatei bis zu einem bestimmten Punkt auslesen
Hi!
Ich habe hier eine Textdatei die folgendermaßen aufgebaut ist:
Zitat:
1|text|64.246.38.98|6667|28,8|10,3|1567

Wie kann ich den text bis zu dem ersten | auslesen und dann z.b. in ein Editfeld schreiben oder als Caption für ein Label? Und wie geht das dann bis zum 2. |?? :oops:


Tweafis - So 22.06.03 12:22

Such mal hier im forum nach explode


Delete - So 22.06.03 12:37

http://www.delphi-forum.de/viewtopic.php?p=45780#45780
Da hin hat mich die Suchfunktion gebracht, nur hilft mir das irgendwie gar nix :oops: O gott, warum ist Delphi so schwer :(


Tweafis - So 22.06.03 13:59

Kopier dir Funktion mal + die Typdeklaration.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
MyExpl: TStringDynArray;
{ ... }

{ In S die Zeile einlesen }

// 1|text|64.246.38.98|6667|28,8|10,3|1567
// 0|1   |2           |3   |4   |5   |6   

{ Das Untere ist die Adressierung im Array }

MyExpl := Explode('|', S); // Das Array füllen

// dann z.B.
Label1.Caption := MyExpl[0];  // siehe oben
Edit1.Text := MyExpl[1];
IPEdit1.Text := MyExpl[2]; // Hab mal angenommen das ist ne IP


Delete - So 22.06.03 14:04


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:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm);
  TStringDynArray = array of string;

 private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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;

end.

Das funktioniert leider auch nich, oder hab ich was falsch gemacht? :oops:


Tweafis - So 22.06.03 14:05

Was geht denn nicht? Fehlermeldung,...? Das ist nur die Funktion, du verarbeitest ja gar keine Daten.


Delete - So 22.06.03 14:09

Zitat:
[Fehler] Unit1.pas(15): '=' erwartet, aber Bezeichner 'public' gefunden
[Fehler] Unit1.pas(17): ';' erwartet, aber 'END' gefunden
[Fehler] Unit1.pas(22): '.' erwartet, aber 'IMPLEMENTATION' gefunden
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

:(


Tweafis - So 22.06.03 14:10

Du musst die Typdeklaration nicht in dein Form rein sondern kurz vor der Funktion aber NICHT IN DEINE TFORM1 REIN.


Tweafis - So 22.06.03 14:12

Das geht:


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:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{-----------------------------------------------------------------------------
  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;

procedure TForm1.Button1Click(Sender: TObject);
var
  VItems: TStringDynArray;
  x: Integer;

begin
  VItems := Explode('|', Edit1.Text);
  for x := Low(VItems) to High(Vitems) do
    ShowMessage('VItems['+inttostr(x)+'] = '+VItems[x]);
end;

end.


Du brauchst nur ein Edit und ein Button


Delete - So 22.06.03 14:24

Oke, also Errors kommen jetzt mal keine, nur funktionieren tut das ned. Ich hab ne Textdatei in C:\test mit dem namen test.txt. Drin steht 123|456.
Geb ich in das Edit Feld C:\test\test.txt ein und klick auf den Button, kommt nur ne Message
Zitat:
VItems[0] = C:\test\test.txt


Tweafis - So 22.06.03 14:26

Das war nur ein Beispiel, du musst in das Edit direkt die Zeile eingeben. Schreiben musst du dein Programm schon selber. Also Zeile auslesen und per ArrayIndex den Einzelnen Labels und Edits oder sowas den string zuweisen...


Delete - So 22.06.03 14:28

Mitt Zeile angeben gehts. Klasse danke! :dance2:


Tweafis - So 22.06.03 14:34

Gern geschehen :D probier halt nöchstes mal direkt die Posts besser zu lesen bztw den Code mal selberzu debuggen und logisch durchzugehen, davon lernst du meistens mehr als wenn dir das hier jemand erklärt! Ist ernsthaft also Wenn du siehst das da viele Fehler sind, dass du mal guckst woran es liegen könnte!