Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TSTRINGLIST in ein Array kopieren (https://www.delphipraxis.net/163726-tstringlist-ein-array-kopieren.html)

gallstone 13. Okt 2011 13:06

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!

mkinzler 13. Okt 2011 13:10

AW: TSTRINGLIST in ein Array kopieren
 
Warum, auf eine Stringliste kannst du doch auch indiziert zugreifen.

gallstone 13. Okt 2011 13:15

AW: TSTRINGLIST in ein Array kopieren
 
Zitat:

Zitat von mkinzler (Beitrag 1130259)
Warum, auf eine Stringliste kannst du doch auch indiziert zugreifen.

Danke für die schnelle Antwort!

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!

mkinzler 13. Okt 2011 13:22

AW: TSTRINGLIST in ein Array kopieren
 
Delphi-Quellcode:
var
    sl: TStrings;
    ...
begin
  sl := TStringList.Create;
  sl.Delimiter := #9;
  sl.DelimitedText := ...
Danach kannst du per sl[<index>] indiziert zugreifen.

DeddyH 13. Okt 2011 13:24

AW: TSTRINGLIST in ein Array kopieren
 
Je nach Delphi-Version ggf. noch StrictDelimiter auf true setzen, falls Leerzeichen in den Daten vorkommen können.

Bummi 13. Okt 2011 13:33

AW: TSTRINGLIST in ein Array kopieren
 
Wenn Du die Möglichkeit hast ADO zu verwenden kannst Du die Textdatei direkt als Tabelle öffnen....

gallstone 13. Okt 2011 13:33

AW: TSTRINGLIST in ein Array kopieren
 
Zitat:

Zitat von mkinzler (Beitrag 1130264)
Delphi-Quellcode:
var
    sl: TStrings;
    ...
begin
  sl := TStringList.Create;
  sl.Delimiter := #9;
  sl.DelimitedText := ...
Danach kannst du per sl[<index>] indiziert zugreifen.

Hi,

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)?

gallstone 13. Okt 2011 13:35

AW: TSTRINGLIST in ein Array kopieren
 
Zitat:

Zitat von Bummi (Beitrag 1130267)
Wenn Du die Möglichkeit hast ADO zu verwenden kannst Du die Textdatei direkt als Tabelle öffnen....

Hi,

ich habe ADO in der Komponentenleiste.
Ich vermute aber mit meinem noobwissen werde ich da nicht weit kommen ;)

DeddyH 13. Okt 2011 13:38

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.

gallstone 13. Okt 2011 13:57

AW: TSTRINGLIST in ein Array kopieren
 
Zitat:

Zitat von DeddyH (Beitrag 1130271)
Markus' Code musst Du je Zeile ausführen, dann sind die einzelnen tab-getrennten Felder die Items der Stringliste.

ich rall das dennoch nicht.

du sagst also für jede zeile:

Code:
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;
So?

p80286 13. Okt 2011 14:05

AW: TSTRINGLIST in ein Array kopieren
 
eher so
Delphi-Quellcode:
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;
(ohne gewähr, das nutze ich seltenst bis überhaupt nicht)

Gruß
K-H

DeddyH 13. Okt 2011 14:08

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;

Bummi 13. Okt 2011 14:53

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.

gallstone 14. Okt 2011 13:01

AW: TSTRINGLIST in ein Array kopieren
 
Zitat:

Zitat von Bummi (Beitrag 1130290)
zum Fertigbasteln, ein Rohgerüst:

hi und danke!

das sind mir aber zu viele dinge ich nicht nachvollziehen kann :)

gallstone 14. Okt 2011 13:05

AW: TSTRINGLIST in ein Array kopieren
 
Zitat:

Zitat von DeddyH (Beitrag 1130278)
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;

hi und danke,

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!

DeddyH 14. Okt 2011 13:19

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;

p80286 14. Okt 2011 15:27

AW: TSTRINGLIST in ein Array kopieren
 
Zitat:

Zitat von gallstone (Beitrag 1130467)
dennoch erschließt sich mir nicht wie ich dann zum beispiel das feld [5,10] aufrufen soll.

darum ist es bisher ja auch nicht gegangen.
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:
Showmessage(myarray[5,10];
Gruß
K-H

gallstone 17. Okt 2011 14:40

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:
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;
Danke euch vielmals für eure Bemühungen, werde sicher wieder gern auf euch zurückkommen :)

DeddyH 17. Okt 2011 14:47

AW: TSTRINGLIST in ein Array kopieren
 
DelimitedText hättest Du aber ganz bequem nachlesen können ;)

Bjoerk 17. Okt 2011 15:35

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, ..) .

TiGü 17. Okt 2011 16:33

AW: TSTRINGLIST in ein Array kopieren
 
Zitat:

Zitat von gallstone (Beitrag 1130258)
Wie kann ich die Stringlist in das Array kopieren?

Weiß nicht was all das Geraffel von den anderen hier soll, aber mach es einfach so, wenn du Delphi 2009 oder höher hast:

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;

gallstone 21. Okt 2011 13:18

AW: TSTRINGLIST in ein Array kopieren
 
Zitat:

Zitat von TiGü (Beitrag 1130874)
wenn du Delphi 2009 oder höher hast:

habsch net :)
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