Entwickler-Ecke

Dateizugriff - Assoziative Arrays und andere Fragen.


Anonymous - Do 13.03.03 18:43
Titel: Assoziative Arrays und andere Fragen.
Moin,

vor über einem halben Jahr hat das schon mal jemand gefragt, aber die Antwort dazu ist inakzeptabel: Gibt es in Delphi assoziative Arrays? Spricht man ein Array normalerweise mit array[12] an, so geht das mit ass. Arrays mit array['feldname']. Also gibt es das? Wenn ja, warum will das bei mir nicht?

Zweite Frage: Bei PHP gibt es mindestens zwei Funktionen (explode und split, wer sich das Manual von PHP dazu mal antuen möchte...), mit denen man einen String an bestimmten Stellen aufsplitten kann und die Teilstücke in einem Array gespeichert werden. Gibt es das etwa auch nicht bei Delphi?

Dritte Frage: Bei PHP gibt es (was gibt es da nicht...) eine Funktion, die Leerzeichen, Zeilenumbrüche (\r und \n z.B.) und andere Dinge am Anfang und am Ende eines Strings entfernt. Gehe ich recht in der Annahme, dass Delphi wieder passen muss?

Erstes Problem: Ich hab mir aus der Hilfe von diesem Progrämmchen einen bisschen Code, zum auslesen von Dateien kopiert und eben jenen ein wenig gekürzt. Das sieht dann so aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var fh: textfile;
var ch: string;
{ ...einige Zeilen später... }
assignfile(fh, 'test.dat');
reset(fh);
while not eof(fh) do
 read(fh, ch);
closefile(fh);

Er bleibt in einer Endlosschleife hängen. Wieso ist mir nicht klar. Die Datei gibt es selbstverständlich und ist mit 08/15-Text gefüllt.


So, das war's erstmal von mir hier. Wäre fein, wenn die Fragen nicht ewig offen bleiben.

Danke.


naleh - Do 13.03.03 18:55

Wenn du mit strings arbeiten willst wuerde ich dir zu ner Stringlist raten(TStrings) koennte so gehen:


Quelltext
1:
2:
3:
4:
5:
var sl: TStrings;
       i: integer;
begin
sl:= TStringList.create;
sl.LoadFromFile('test.txt');

und zum anzeigen in einem memo

Quelltext
1:
2:
memo1.clear;
for i := 0 to sl.count-1 do memo1.lines.add(sl[i]);

hab das aber nicht getestet
MfG naleh


alex_id - Do 13.03.03 19:11

Hi

hier was zu deinen assoziativen Arrays !!! es geht !!
so kann man es erzeugen und darauf zugreifen !!


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject); 
var 
  Feld: TStrings; 
begin 
  Feld := TStringList.Create; 
  Feld.Add(Format('%s=%s', ['alex', '01.01.2000'])); 
  ShowMessage(Feld.Values['alex']) 
  // zeigt den Geburtstag an
  Feld.Free; 
end;


ich hoffe es hilft !!

Alex


mars - Do 13.03.03 20:08

Versuchs mal mit ReadLn statt Read. Ich denke, das sollte eher deinen Wünschen entsprechen..


Tower - Fr 14.03.03 09:48

Zur dritten Frage: Nein, falsche Annahme. "Trim" heißt das Zauberwort.


Delete - Fr 14.03.03 10:05

1. Bitte für jede Frage ein Thread.
2. Wo ist der Bezug deiner Fragen zu der Sparte wo du postes?
1. Frage: Hat das was mit Dateien zu tun? Nein.
2. Frage: Hat das was mit Dateien zu tun? Nein.
3. Frage: Hat das was mit Dateien zu tun? Nein.
4. Der Code, ja, der hat was mit der Sparte zu tun.

Also, zur 2. Frage:

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 < 0) then 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 = nil) or ((Limit > 0) and (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;


Zur 3. Frage: trim, StringReplace.

Zum Code: Versuch es mal mit ReadLn


Tino - Fr 14.03.03 10:25

Hallo und willkommen hier im Forum,

bitte beachte in Zukunft die Richtlinien. Speziell folgender Absatz:
Richtlinien hat folgendes geschrieben:
1.2 Posten in die richtige Sparte

Das Delphi-Forum ist - wie du sicherlich schon bemerkt hast - in verschiedene Sparten unterteilt, wobei sich mehrere direkt mit der Behandlung programmiertechnischer Probleme befassen. Es ist aufgrund der Anzahl von Fragen notwendig, diese in die richtige Sparte zu posten, damit kein Chaos entsteht und jedem Mitglied gezielt geholfen werden kann.

Danke Dir!

Gruß
TINO


AndyB - Fr 14.03.03 18:38

Luckie hat folgendes geschrieben:
Also, zur 2. Frage:

Quelltext
1:
2:
3:
4:
5:
6:
{-----------------------------------------------------------------------------
  Procedure : Explode
  Purpose   : Seperates a CSV-line
  Arguments : const Separator, S: string; Limit: Integer = 0
  Result    : TStringDynArray
-----------------------------------------------------------------------------}

Der Quellcode kommt mir so bekannt [http://www.delphipraxis.net/viewtopic.php?t=3538#25415] vor.


Delete - Fr 14.03.03 21:53

Jupp. Und? Ich habe niegrgens behauptet der Code wär von mir. Da jbg auch keinen Autor genannt hat, kann nich auch nicht sagen, ob es von ihm ist.


AndyB - Sa 15.03.03 01:34

Luckie hat folgendes geschrieben:
Jupp. Und?

War nicht böse gemeint.

Zitat:
Da jbg auch keinen Autor genannt hat, kann nich auch nicht sagen, ob es von ihm ist.

Er ist von mir.


Gruß
jbg


hitstec - Sa 15.03.03 03:00
Titel: Eine ein einbißchen einfachere Variante
Ich darf mich selbst zitieren:

http://www.swissdelphicenter.ch/de/showcode.php?id=1488


Hier ein Auszug:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type 
  ArrOfStr = array of string; 

function explode(sPart, sInput: string): ArrOfStr; 
begin 
  while Pos(sPart, sInput) <> 0 do  
  begin 
    SetLength(Result, Length(Result) + 1); 
    Result[Length(Result) - 1] := Copy(sInput, 0,Pos(sPart, sInput) - 1); 
    Delete(sInput, 1,Pos(sPart, sInput)); 
  end; 
  SetLength(Result, Length(Result) + 1); 
  Result[Length(Result) - 1] := sInput; 
end;


Delete - Sa 15.03.03 04:59

AndyB hat folgendes geschrieben:
Luckie hat folgendes geschrieben:
Jupp. Und?

War nicht böse gemeint.

Habe ich auch nicht so verstanden. :wink:
Zitat:

Zitat:
Da jbg auch keinen Autor genannt hat, kann nich auch nicht sagen, ob es von ihm ist.

Er ist von mir.


Gruß
jbg


Aha, also jbg und AndyB sind ein und die gleiche Person. Wenn du mir sagst, was du für einen Namen da stehen haben willst, dann wirst du mit deinem Namen namentlich in meiner AdressSB im Code erwähnt, wenn du es wünscht. Wenn es dein realer Name sein soll, schick mir eine PN.