Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datei in Stringgrid einlesen (https://www.delphipraxis.net/12976-datei-stringgrid-einlesen.html)

n00b_on_knees 8. Dez 2003 13:05


Datei in Stringgrid einlesen
 
Hallo!

Ich soll eine .csv Datei in ein Stringgrid einlesen. Es soll so von statten gehen, das
hier bei diesem Bsp. 7 Spalten und 28 Reihen gegeben sein sollen. Einzelne Wörter sind mit einem Zeichen, als Bsp. hier mit einem '.' (ohne ') getrennt. Diese einzelnen Wörter sollen ins Stringgrid geschrieben werden. Die Anzahl der Spalten und Zeilen soll sich auf die Datei anpassen..
(also wenn es mehr Spalten als 7 gibt, soll eine 8. erscheinen, wenn mehr Reihen werden, nach unten hin verlängern.)

Ich bin leider noch nicht besonders weit...

Delphi-Quellcode:
procedure TForm1.btStartClick(Sender: TObject);
var
  f: textfile;
  i, j: integer;
  fn, zeile: string;
begin
  OpenDialog1.Execute;
  fn:= OpenDialog1.FileName;
  AssignFile(f,fn);
  reset(f);
  //...
end;
end.
ist leider alles was ich bis jetzt geschafft habe, also das öffnen der Datei, habe es auch schon geschafft die ganze Datei in einem einzelnen StringGridFeld auszugeben, nur das bringt sich nicht viel, da das ja nicht gewünscht ist.

Ich hoffe ihr könnt mir helfen, der Angabe gerecht zu werden.
Danke im Vorraus.
MFG

Christian Seehase 8. Dez 2003 14:04

Re: Datei in Stringgrid einlesen
 
Moin n00b_on_knees,

dazu fallen mir noch folgende Stichworte ein, unter denen Du erst mal in der Hilfe, oder auch hier schauen solltest:

pos
copy
Delete
TStringGrid.RowCount bzw. ColCount
ReadLn
TStringList.CommaText

ausserdem haben wir in der CodeLib noch einen Ersatz für pos, bei dem man den Startwert vorgeben kann.

Luckie 8. Dez 2003 14:06

Re: Datei in Stringgrid einlesen
 
Man kann dazu aber auch schon die fertige Funktion ExplodeExplode aus der Code-Lib benutzen. :wink:

n00b_on_knees 8. Dez 2003 15:51

Re: Datei in Stringgrid einlesen
 
danke für eure antworten

@luckie
puh das ganze ist denke ich etwas zu lang, und ich kenne mich da leider nicht so besonders gut aus, dass ich das hier einbauen könnte.

@christian seehase
ja diese Begriffe kenne ich ja, und ich habe wohl auch schon einen Lösungsweg im Kopf, doch leider kann ich wohl das ganze nicht so wirklich umsetzen.

Kann ich auf die Datei wie in einem Feld oder String an sich zugreifen, ala "i-tes Element der Datei" = '.'? wie erkennt man ob eine neue Zeile angefangen hat, bzw. wie kommt man in die nächste Zeile?

himitsu 8. Dez 2003 16:31

Re: Datei in Stringgrid einlesen
 
Explode (Ein dynamisches Array aus einem String erzeugen)

Delphi-Quellcode:
Function Explode(Const Separator, S: String; Limit: Integer = 0): TStringDynArray;
  ... {hier den Code von Explode einfügen}

Procedure TForm1.btStartClick(Sender: TObject);
  Var f: TextFile;
    Zeile, I: Integer;
    ZeileS: String;
    ZeileA: TStringDynArray;

  Begin
    OpenDialog1.Execute;
    Zeile := 0;
    StringGrid1.RowCount := StringGrid1.FixedRows + 1;
    StringGrid1.ColCount := StringGrid1.FixedCols + 1;
    StringGrid1.Cells[StringGrid1.FixedCols, StringGrid1.FixedRows] := '';
    AssignFile(f, OpenDialog1.FileName);
    Reset(f);
    While not EoF(F1) do Begin
      ReadLn(f, ZeileS);
      ZeileA := Explode('.', ZeileS);
      Inc(Zeile);
      StringGrid1.RowCount := StringGrid1.FixedRows + Zeile;
      If StringGrid1.ColCount < StringGrid1.FixedCols + Length(ZeileA) Then
        StringGrid1.ColCount := StringGrid1.FixedCols + Length(ZeileA);
      For I := 0 to Length(ZeileA) - 1 do
        StringGrid1.Cells[StringGrid1.FixedCols + I, StringGrid1.FixedRows + Zeile - 1] := ZeileA[I];
    End;
    CloseFile(f);
  End;
(nicht getestet)

Wenn es funktioniert, wird die Datei ins StringGrid1 geladen, dabei wird sogar alles so verschieben, dass die Daten nicht in den fixierten Spalten/Zeilen stehen. (in die fxierten Teile können dann noch Überschriften oder so eingetragen werden)

Wenn die fixierten Zeilen/Spalten nicht benötigt werden, braucht StringGrid1.FixedCols und StringGrid1.FixedRows einfach nur auf 0 gesetzt werden. StringGrid1.FixedCols und StringGrid1.FixedRows können dann einfach rausgekürtzt werden (einfach löschen).

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

n00b_on_knees 8. Dez 2003 16:49

Re: Datei in Stringgrid einlesen
 
dankeschön.
nur in der funktion explode gibt es ein paar inkompatible typen, eigentlich immer bei result, und auch den rückgabetyp kennt er nicht, habe den mal durch eben TStringGrid ersetzt, doch dann steht 2 mal diese klasse besitzt kein standartobjekt.

himitsu 8. Dez 2003 17:13

Re: Datei in Stringgrid einlesen
 
Also noch ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif,

Delphi-Quellcode:
Uses Types;

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 := AnsiStrPos(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);
        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);
  End;

Procedure TForm1.btStartClick(Sender: TObject);
  Var f: TextFile;
    Zeile, I: Integer;
    ZeileS: String;
    ZeileA: TStringDynArray;

  Begin
    OpenDialog1.Execute;
    Zeile := 0;
    StringGrid1.RowCount := StringGrid1.FixedRows + 1;
    StringGrid1.ColCount := StringGrid1.FixedCols + 1;
    StringGrid1.Cells[StringGrid1.FixedCols, StringGrid1.FixedRows] := '';
    AssignFile(f, OpenDialog1.FileName);
    Reset(f);
    While not EoF(f) do Begin
      ReadLn(f, ZeileS);
      ZeileA := Explode('.', ZeileS);
      Inc(Zeile);
      StringGrid1.RowCount := StringGrid1.FixedRows + Zeile;
      If StringGrid1.ColCount < StringGrid1.FixedCols + Length(ZeileA) Then
        StringGrid1.ColCount := StringGrid1.FixedCols + Length(ZeileA);
      For I := 0 to Length(ZeileA) - 1 do
        StringGrid1.Cells[StringGrid1.FixedCols + I, StringGrid1.FixedRows + Zeile - 1] := ZeileA[I];
    End;
    CloseFile(f);
  End;
TStringDynArray ist in der Unit Types deklariert.
Fals die Unit Types nicht vorhanden ist, brauchst du nur diese Zeile
Delphi-Quellcode:
Uses Types;
durch diese
Delphi-Quellcode:
Type TStringDynArray = Array of String;
ersetzen.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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