![]() |
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:
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.
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. Ich hoffe ihr könnt mir helfen, der Angabe gerecht zu werden. Danke im Vorraus. MFG |
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. |
Re: Datei in Stringgrid einlesen
Man kann dazu aber auch schon die fertige Funktion
![]() |
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? |
Re: Datei in Stringgrid einlesen
Explode (
![]()
Delphi-Quellcode:
(nicht getestet)
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; 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 ![]() ![]() ![]() |
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. |
Re: Datei in Stringgrid einlesen
Also noch ein Hallöle von
![]()
Delphi-Quellcode:
TStringDynArray ist in der Unit Types deklariert.
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; Fals die Unit Types nicht vorhanden ist, brauchst du nur diese Zeile
Delphi-Quellcode:
durch diese
Uses Types;
Delphi-Quellcode:
ersetzen.
Type TStringDynArray = Array of String;
http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
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