![]() |
TSTRINGLIST in ein Array kopieren
Hi,
ich möchte folgendes angehen. (bin noob ^^) Ich habe hier eine Tabelle in einer txt-Datei. Die einzellnen Daten sind durch Tabstops getrennt. Die Zeilenanzahl kann varieren. Nun habe ich erfolgreich die Datei über den Öffnendialog geladen und kann diese auch in eine Editfeld laden, etc. Ich möchte das aber gern in einem array (jede Zelle der Tablle ein Platz im Array, kann Text oder Zahl sein) unterbringen um die spätere Auswertung der Datei zu bewerkstelligen. Nur leider habe ich keine Ahnung wie ich da ran gehen soll. Wie kann ich die Stringlist in das Array kopieren? Hoffe mir kann geholfen werden. Danke im vorraus! |
AW: TSTRINGLIST in ein Array kopieren
Warum, auf eine Stringliste kannst du doch auch indiziert zugreifen.
|
AW: TSTRINGLIST in ein Array kopieren
Zitat:
Nach dem Motto einfach die Tabstops suchen? Ich hatte mir das so vorgestellt array [1,2]=Auftragsnummer array [1,3]=Datum array [2,2]= Auftragsnummer etc. Das macht sich ja mit der durch Tabstops getrennten Liste schwieriger, oder nicht? :) Grüße! |
AW: TSTRINGLIST in ein Array kopieren
Delphi-Quellcode:
Danach kannst du per sl[<index>] indiziert zugreifen.
var
sl: TStrings; ... begin sl := TStringList.Create; sl.Delimiter := #9; sl.DelimitedText := ... |
AW: TSTRINGLIST in ein Array kopieren
Je nach Delphi-Version ggf. noch StrictDelimiter auf true setzen, falls Leerzeichen in den Daten vorkommen können.
|
AW: TSTRINGLIST in ein Array kopieren
Wenn Du die Möglichkeit hast ADO zu verwenden kannst Du die Textdatei direkt als Tabelle öffnen....
|
AW: TSTRINGLIST in ein Array kopieren
Zitat:
so richtig rall ich das nicht: sl.Delimiter:=#9; habe ich eintragen. was macht s.delimitedtext? wenn ich jetzt sl[5] mache, dann gibt er mit zum beispiel die 5. zeile aus (komplett, wie man es halt kennt)... wo hängts bei mir (außer das ich noob bin)? |
AW: TSTRINGLIST in ein Array kopieren
Zitat:
ich habe ADO in der Komponentenleiste. Ich vermute aber mit meinem noobwissen werde ich da nicht weit kommen ;) |
AW: TSTRINGLIST in ein Array kopieren
Markus' Code musst Du je Zeile ausführen, dann sind die einzelnen tab-getrennten Felder die Items der Stringliste.
|
AW: TSTRINGLIST in ein Array kopieren
Zitat:
du sagst also für jede zeile:
Code:
So?
procedure DateiEinlesen(Dateiname:string);
var sl: TStringList; s:string; i:integer; begin sl:=TStringList.Create; //Objekt erzeugen try sl.LoadFromFile(dateiname); //Datei in Stringliste laden finally form1.richedit1.Text:=sl.Text; for i:=0 to sl.Count-1 do Begin sl.Delimiter:=#9; end; sl.free; //Objekt wieder freigeben end; end; |
AW: TSTRINGLIST in ein Array kopieren
eher so
Delphi-Quellcode:
(ohne gewähr, das nutze ich seltenst bis überhaupt nicht)
dl : tstringlist;
... dl:=tstringlist.create; for i:=0 to sl.count-1 do begin dl.clear; dl.delimitedtext:=sl[i]; for j:=0 to dl.count do array[x,j]:=dl[j]; end; Gruß K-H |
AW: TSTRINGLIST in ein Array kopieren
Ohne Fehlerbehandlung und ungetestet:
Delphi-Quellcode:
procedure DateiEinlesen(const Dateiname: string);
var LineList, FieldList: TStrings; i, j: integer; begin //Zeilen LineList := TStringlist.Create; try LineList.LoadFromFile(Dateiname); //Felder FieldList := TStringlist.Create; try FieldList.Delimiter := #9; FieldList.StrictDelimiter := true; for i := 0 to LineList.Count - 1 do begin //Zeile in Felder zerlegen FieldList.DelimitedText := LineList[i]; //...und durchgehen for j := 0 to FieldList.Count - 1 do (* etwas mit dem Feld tun *) end; finally FieldList.Free; end; finally LineList.Free; end; end; |
AW: TSTRINGLIST in ein Array kopieren
zum Fertigbasteln, ein Rohgerüst:
(ja ich weiß es gibt Objektlisten, ja da könnten noch try finallys rein, ja einen Setter könnte man auch noch .........)
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TCVSClass=Class private Ffn:String; Fsl:TStringList; Fll:TList; function GetColumns: Integer; function GetRows: Integer; public Constructor Create(const fn:String;aDelimiter:Char); Destructor Destroy; Function GetElement(x, y: Integer): String; published Property Columns:Integer read GetColumns; Property Rows:Integer read GetRows; End; TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TCVSClass } constructor TCVSClass.Create(const fn: String;aDelimiter:Char); var i:Integer; begin FFn := fn; Fsl := TStringList.Create; Fsl.LoadFromFile(fn); Fll := TList.Create; for I := 0 to Fsl.Count - 1 do begin Fll.Add(TStringList.Create); with TStringList(FLL[FLL.Count-1]) do begin Delimiter := aDelimiter; DelimitedText := Fsl[i]; end; end; end; destructor TCVSClass.Destroy; var i:Integer; begin Fsl.Free; for I := 0 to Fll.Count - 1 do TStringList(Fll[i]).free; Fll.Free; end; function TCVSClass.GetColumns: Integer; begin if Fll.Count>0 then Result := TStringList(FLL[0]).count else Result := 0; end; function TCVSClass.GetElement(x, y: Integer): String; begin if (y > -1) and (y < Fll.Count) then begin if (x > -1) and ( x < TStringList(FLL[y]).Count) then begin Result := TStringList(FLL[y])[X]; end else Result := ''; end else Result := ''; end; function TCVSClass.GetRows: Integer; begin Result := Fll.Count; end; procedure TForm1.Button1Click(Sender: TObject); var x,y:Integer; begin With TCVSClass.Create('C:\temp\Mappe1.csv',';') do begin for x := 0 to Rows do for y := 0 to Columns do Memo1.Lines.Add(GetElement(x,y)); end; end; end. |
AW: TSTRINGLIST in ein Array kopieren
Zitat:
das sind mir aber zu viele dinge ich nicht nachvollziehen kann :) |
AW: TSTRINGLIST in ein Array kopieren
Zitat:
deines kann ich schon mehr nachvollziehen. dennoch erschließt sich mir nicht wie ich dann zum beispiel das feld [5,10] aufrufen soll. also nach dem alles gemacht wurde. ansonsten habe ich angefangen mir ein dyn arry zu bauen. so kann ich das schon mit text füllen und ausgeben. brauche nur noch nach den tabs zu suchen und alles in die felder eintragen. es sei denn du kannst mir das idiotensicher aufzeigen ;) - deine lösung würde auf jeden fall den QT verkürzen ;) grüße! |
AW: TSTRINGLIST in ein Array kopieren
Immer noch ungetestet, sollte aber hoffentlich funktionieren.
Delphi-Quellcode:
type
TDeinArray = array of array of string; procedure DateiEinlesen(const Dateiname: string; out ResultArray: TDeinArray); var LineList, FieldList: TStrings; i, j: integer; begin //Zeilen LineList := TStringlist.Create; try LineList.LoadFromFile(Dateiname); //erste Dimension ist nun bekannt, Länge setzen SetLength(ResultArray, LineList.Count); //Felder FieldList := TStringlist.Create; try FieldList.Delimiter := #9; FieldList.StrictDelimiter := true; for i := 0 to LineList.Count - 1 do begin //Zeile in Felder zerlegen FieldList.DelimitedText := LineList[i]; //Nun ist auch die zweite Dimension bekannt, Länge setzen SetLength(ResultArray[i], FieldList.Count); //...und befüllen for j := 0 to FieldList.Count - 1 do ResultArray[i][j] := FieldList[j]; end; finally FieldList.Free; end; finally LineList.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); var TestArray: TDeinArray; i: integer; begin DateiEinlesen('C:\Dideldum\Wuppdi.txt', TestArray); for i := Low(TestArray) to High(TestArray) do ShowMessage(Format('Zeile %d enthält %d Felder.', [i + 1, Length(TestArray[i])])); end; |
AW: TSTRINGLIST in ein Array kopieren
Zitat:
Du wolltest den inhalt einer Stringliste (Datei) in ein Array übertragen. Da sind die Daten jetzt. Und so kannst Du auf die Inhalte zugreifen: z.B.
Delphi-Quellcode:
Gruß
Showmessage(myarray[5,10];
K-H |
AW: TSTRINGLIST in ein Array kopieren
Hi,
also da ich gern verstehe was ich mache, habe ich mir das nun doch selbst gebastelt. Hier seid einfach zu Pro ;):
Code:
Danke euch vielmals für eure Bemühungen, werde sicher wieder gern auf euch zurückkommen :)
var
Feld : array of array of string; procedure DateiEinlesen(Dateiname:string); var sl: TStringList; auswahl:string; stelle,i,k:integer; begin sl:=TStringList.Create; //Objekt erzeugen try sl.LoadFromFile(dateiname); //Datei in Stringliste laden finally setlength(feld,sl.Count,30); i:=0; //Zähler für Zeilen k:=0; //Zähler für Spalten while i<=sl.Count-1 do //abarbeiten Zeilen begin k:=0; auswahl:=sl.Strings[i]; //i-te Zeile in Zwischenstring Auswahl laden while k<=29 do //abarbeiten Spalten begin stelle:=pos(#9,auswahl); //wenn TAB gefunden = neue Spalte (Stelle=TabPosition) feld[i,k]:=copy(auswahl,0,stelle-1); //eintragen in das Array auswahl:=copy(auswahl,stelle+1,length(auswahl)); //string wird um eingetragenes gekürzt k:=k+1; end; i:=i+1; end; form1.RichEdit1.Clear; //Wiedergabe Array in RichEdit, zu Testzwecken i:=0; while i<=sl.Count-1 do begin k:=0; while k<=29 do begin form1.RichEdit1.Text:=form1.RichEdit1.Text+#9+feld[i,k]; k:=k+1; end; form1.RichEdit1.Lines.Add(' '); i:=i+1; end; sl.free; //Objekt wieder freigeben end; end; |
AW: TSTRINGLIST in ein Array kopieren
![]() |
AW: TSTRINGLIST in ein Array kopieren
Statt SL.Strings[I] kann man einfach SL[I] schreiben und Strings beginnen in Delphi mit 1, also Copy (Auswahl, 1, ..) .
|
AW: TSTRINGLIST in ein Array kopieren
Zitat:
Delphi-Quellcode:
var
StringList: TList<String>; StringArray: TArray<string>; begin StringList := TList<String>.Create; StringList.Add(... //oder per .AddRange befüllen. StringArray := StringList.ToArray; end; |
AW: TSTRINGLIST in ein Array kopieren
Zitat:
habe nur 2007. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 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