Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi array of array aus textfile (https://www.delphipraxis.net/138387-array-array-aus-textfile.html)

danieleh 9. Aug 2009 14:03


array of array aus textfile
 
Hallo

Gemäss Posting (Beitrag #25)
möchte ich den Inhalt eines tab-getrenntes Textfiles (Datetime, Messwert1, Messwert2, MesswertN) in ein Array (of Double) pipen

Es klappt ganz gut die Werte (der Spalten) in je ein separates Array zu schreiben. Jedoch wäre es eleganter alles in ein einziges zweidimensionales Array zu schreiben.
Und da hab ich einen Knopf. Vielleicht hat jemand eine Idee?
Zusätzlich: wie kann man Null-Werte abfangen (bei yi[i]:= StrToFloat)? "Try ... except ... end" scheint nicht zu funktionieren.

hier meine Prozedur:

Delphi-Quellcode:
procedure TDemoForm.Button2Click(Sender: TObject);
var
    i: integer;
    List1,List2 : TStringList;
    xi,yi : array of double;
    xyi: array of array of double;
    t : TDateTime;
    MySettings: TFormatSettings;
begin
  GetLocaleFormatSettings(GetUserDefaultLCID, MySettings);
  MySettings.DateSeparator := '.';
  MySettings.TimeSeparator := ':';
  MySettings.ShortDateFormat := 'dd.mm.yyyy';
  MySettings.ShortTimeFormat := 'hh:nn:ss';


  List1:=TStringList.Create;
  try
    List1.LoadFromFile('TabSeparated.txt');
    List2:=explode(#9,List1[i]);
   // showmessage(inttostr(List1.Count-1));

    setLength(xi,List1.Count);
    setLength(yi,List1.Count);
    setlength(xyi,List1.Count,List2.Count);

    for i:=0 to List1.Count-1 do
      begin
        List2:=explode(#9,List1[i]);

   ListBox1.Items.Insert(i, List2[0]);
        ListBox2.Items.Insert(i, List2[1]);
        ListBox3.Items.Insert(i, List2[2]);
        ListBox4.Items.Insert(i, List2[3]);

        xi[i]:= StrToDateTime(List2[0], MySettings);
        yi[i]:= StrToFloat(List2[3]);

       // xyi ??

        List2.free;
      end;

  finally
    List1.Free;
  end;

 //  showmessage(DateTimeToStr(yi[5])) ;
 //  showmessage(floattostr(yi[5])) ;
end;

jaenicke 9. Aug 2009 14:24

Re: array of array aus textfile
 
Zitat:

Zitat von danieleh
Zusätzlich: wie kann man Null-Werte abfangen (bei yi[i]:= StrToFloat)?

TryStrToFloat?

Zitat:

Zitat von danieleh
"Try ... except ... end" scheint nicht zu funktionieren.

In Delphi werden Exceptions auch mit try..except angezeigt, wenn du es nicht anders einstellst, denn dort geht es ja um Fehlerbehebung.
Wenn du das Programm außerhalb von Delphi startest, werden die Exceptions auch nicht angezeigt in try..except.

danieleh 9. Aug 2009 16:13

Re: array of array aus textfile
 
Danke Sebastian für die Null-Werte.

Bleibt noch die Hauptfrage falls jemand weiterhelfen kann.

jaenicke 9. Aug 2009 16:41

Re: array of array aus textfile
 
Eigentlich solltest du schon Compilerwarnungen bekommen, an denen du siehst, wo etwas nicht stimmt. Nämlich z.B., dass i in Zeile 20 noch nicht definiert ist. Aber die ignorierst du ja scheinbar...

Jedenfalls explodest du in deiner Schleife durch List1 ja dann die aktuelle Zeile, und dann müsstest du ja nur noch in einer zweiten Schleife diese Spalten durchgehen. Dann hast du Zeile i und Spalte j z.B., also die beiden Schleifenvariablen.

danieleh 9. Aug 2009 17:34

Re: array of array aus textfile
 
Hallo Sebastian,
Die "einzelnen" Arrays xi und yi ist nur als Test/Beispiel gedacht und funktionieren einwndfrei.

Durch die Funktion Explode (quelle oben beschieben), werden die Spalten bestens getrennt sodass ich sie mit List2[spaltenzahl] lesen kann.

Das Datenfile entält aber n (beliebige Anzahl) Messwerte die ich allesamt in ein 2dArray bringen möchte (nicht nur 2 davon). Ich weiss einfach nicht wie ich sie in das Array bringen kann. Hilfe mit Code würde ich sehr schätzen.

Delphi-Quellcode:
function Explode(const Separator, S: string; Limit: Integer = 0): TStringList;
var
  SepLen: Integer;
  F, P: PChar;
  Index: Integer;
begin
  result := TStringList.Create;
  if (S = '') or (Limit < 0) then Exit;
  if Separator = '' then
  begin
    Result.add(S);
    Exit;
  end;
  SepLen := Length(Separator);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := AnsiStrPos(P, PChar(Separator));
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then
      P := StrEnd(F);
    result.Add(copy(AnsiString(F),0,P-F));
    inc(index,1);
    if P^ <> #0 then Inc(P, SepLen);
  end;
end;

GreenHorn3600 9. Aug 2009 17:47

Re: array of array aus textfile
 
Hallo danieleh,

ich kenne den explode nicht. aber vielleicht hilft dies ja weiter.

Grüße
Greeny

danieleh 9. Aug 2009 18:01

Re: array of array aus textfile
 
Hallo Greeny
Das Explode ist nicht das problem, sondern das erstellen des xyi: array of array of double;

Delphi-Quellcode:
  ...
 var: xyi: array of array of double;
  ...
  List1:=TStringList.Create;
  try
    List1.LoadFromFile('TabSeparated.txt');
    List2:=explode(#9,List1[i]);

    // setLength(xi,List1.Count);
    // setLength(yi,List1.Count);
    setlength(xyi,List1.Count,List2.Count);

    for i:=0 to List1.Count-1 do
      begin
        List2:=explode(#9,List1[i]);

      //  xi[i]:= StrToDateTime(List2[0], MySettings); // <- test ok
      //  yi[i]:= StrToFloat(List2[3]); // <- test ok

        xyi:= ??  //  [b]<-hier das problem. wie machen?[/b]

        List2.free;
      end;
  finally
    List1.Free;

jaenicke 9. Aug 2009 18:44

Re: array of array aus textfile
 
Delphi-Quellcode:
xyi[i, j] := ...
Wie gesagt eben mit einer zweiten Schleife durch die Spalten.

Uwe Raabe 9. Aug 2009 18:45

Re: array of array aus textfile
 
Delphi-Quellcode:
...
var
  xyi: array of array of double;
...
  List1:=TStringList.Create;
  try
    List1.LoadFromFile('TabSeparated.txt');
    setlength(xyi,List1.Count);

    for i:=0 to List1.Count-1 do begin
      List2:=explode(#9,List1[i]);
      try
        setlength(xyi[i],List2.Count);
        for j:=0 to List2.Count - 1 do
          xyi[i, j] := <wandle-den-string-in-einen-wert-um>(List2[j]);
      finally
        List2.free;
      end;
    end;
  finally
    List1.Free;
  end;
...
Das problem könnten allerdings die unterschiedlichen Interpretationen der einzelnen Spalten sein...

danieleh 10. Aug 2009 08:09

Re: array of array aus textfile
 
Super, Danke Alle
passt perfekt. da die erste Spalte immer datetime ist, reicht der folgende code. alle anderen Werte sind float oder integer.

Delphi-Quellcode:
        for j:=0 to List2.Count - 1 do
        begin
          if j=0 then xyi[i, j] := StrToDateTime(List2[j], MySettings)
                 else xyi[i, j] := StrToFloat(List2[j]);


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz