![]() |
array of array aus textfile
Hallo
Gemäss ![]() 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; |
Re: array of array aus textfile
Zitat:
Zitat:
Wenn du das Programm außerhalb von Delphi startest, werden die Exceptions auch nicht angezeigt in try..except. |
Re: array of array aus textfile
Danke Sebastian für die Null-Werte.
Bleibt noch die Hauptfrage falls jemand weiterhelfen kann. |
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. |
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; |
Re: array of array aus textfile
|
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; |
Re: array of array aus textfile
Delphi-Quellcode:
Wie gesagt eben mit einer zweiten Schleife durch die Spalten.
xyi[i, j] := ...
|
Re: array of array aus textfile
Delphi-Quellcode:
Das problem könnten allerdings die unterschiedlichen Interpretationen der einzelnen Spalten sein...
...
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; ... |
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 04:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz