Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren?

Diskutiere Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? im Developer Network Forum im Bereich Hardware & Software Forum; also mein problem ist, dass ich eine *.csv datei in ein delphi proggi einlese, der inhalt ist in etwa so: A;b;f;e;s;s;a;e;v...
  • Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? Beitrag #1
frisbee

frisbee

Bekanntes Mitglied
Dabei seit
17.11.2001
Beiträge
3.841
Reaktionspunkte
0
Ort
BC-E
also mein problem ist, dass ich eine *.csv datei in ein delphi proggi einlese, der inhalt ist in etwa so:

A;b;f;e;s;s;a;e;v
s;d;f;l;k;j;s;h;l;s;
d;f etc.

es können aber auch mehrer buchstaben zwischen den ';' stehen, ein ';' bedeutet in der Tabelle, nächste spalte und ein absatz nächste zeile,

mein prob ist jetzt, dass delphi rummeckert, wenn ich was schreibe mit

while s=eoln oder while s=#13#10 do ...

dann kommt irgendwas mit Eolnerror ...

wie kann ich delphi denn sagen, dass er am zeilenende eine zeile weitergehen soll -> mein problem ist nur wie delphi das zeilenende findet,

hiermal mein quelltext der funzt (jedoch etwas durcheinander und funzt nur wenn nur ein zeichen zwischen den ';' ist):

PHP:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Grids, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    SpeedButton1: TSpeedButton;
    feld: TStringGrid;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    OpenDialog1: TOpenDialog;
    SpeedButton4: TSpeedButton;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Datei_Inhalt:string;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
close;
end;
 
  • Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? Beitrag #2
frisbee

frisbee

Bekanntes Mitglied
Dabei seit
17.11.2001
Beiträge
3.841
Reaktionspunkte
0
Ort
BC-E
procedure TForm1.SpeedButton2Click(Sender: TObject);
var Text_datei: Textfile;
s: String;
i,j,x:integer;
begin
s:=Datei_Inhalt;
i:=0;
j:=0;
x:=0;
// While not EoF(Text_datei) do
// BEGIN //#13#10
while Pos(';',S)>0 do
Begin
feld.ColCount:=feld.ColCount+1;
feld.cells[i,j]:=copy(S,1,(pos(';',S)-1));
x:=x+length(feld.cells[i,j]);
delete(S,1,(pos(';',S)));


if x=length(s) then
begin feld.RowCount:=feld.RowCount+1;
inc(j); i:=0; x:=0
end;
inc(i);

End;

//End;
//nur für letztes Zeichen, wo kein Semikolon mehr kommt
feld.cells[i,j]:=S;
end;


procedure TForm1.SpeedButton3Click(Sender: TObject);
var Text_datei: Textfile;
Text_zeilen,s: string;
i,j,x,b,d:integer;
begin

i:=0;
j:=0;
x:=0;
If OpenDialog1.Execute then
Begin
AssignFile(text_datei,OpenDialog1.Filename);
Reset(text_datei);
While not EoF(Text_datei) do {EoF=EndOfFile, so lange bis Dateiende erreicht}
Begin
Readln(text_datei,s);

b:=length(s);
while Pos(';',S)>0 do
Begin
feld.ColCount:=feld.ColCount+1;
feld.cells[i,j]:=copy(S,1,(pos(';',S)-1));
x:=x+length(feld.cells[i,j]);
delete(S,1,(pos(';',S)));
inc(i);
d:=i;
if length(s)=1 then
begin feld.RowCount:=feld.RowCount+1;
inc(j); i:=0; x:=0
end;


End;
feld.cells[d,j-1]:=s;




End;
CloseFile(text_datei);
End;
StatusBar1.Panels.Items[0].Text:=Extractfilename(opendialog1.FileName);
end;

procedure TForm1.SpeedButton4Click(Sender: TObject);
var i,j:integer;
begin
For j:=0 TO feld.RowCount-1 DO
FOR i:=0 TO feld.ColCount-1 DO
feld.Cells[i,j]:='';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
StatusBar1.Panels.Items[1].Text:=TimeToStr(Now);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
StatusBar1.Panels.Items[2].Text:=DateToStr(Now);
end;

end.
[/PHP]

dabei ist mein problem, dass ich mit einem button die datei auswählen und erst mit dem andern sie einlesen wollte -> wie mach ich das??
 
  • Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? Beitrag #3
H

HbJ

Bekanntes Mitglied
Dabei seit
03.04.1999
Beiträge
141
Reaktionspunkte
0
Ort
Borg-Cubus, Sektor 001
Zum Problem mit dem Auslösen der Buttons:

Ermittle einfach im Eventhandler des "Öffnen"-Buttons den Dateinamen und speichere diesen in einer Klassenvariable.
Beim Druck auf den "Verarbeiten"-Button wird dieser Dateiname dann benutzt und anschließend der String für den Dateinamen geleert, um eine Doppelverarbeitung zu verhindern.


Nun zum Einlesen:
Wie wäre es folgendermaßen:
Code:
var
 SEinlesen, STmp : String;
 StringEnde : Integer;
 // weitere Variablen

begin;

 // eventuelles Vorgeplänkel

 While not EoF(Text_datei) do begin;

  readln(Text_datei, SEinlesen);

  repeat
   StringEnde := pos(';', SEinlesen);
   if StringEnde = 0 then break;
   STmp := copy(SEinlesen, 1, StringEnde-1);
   
   // hier kannst Du den erhaltenen String einfach in das Grid einfügen

   delete(SEinlesen, 1, StringEnde);
   // den verarbeiteten String löschen
  until StringEnde = 0;

 end; { While not EoF(Text_datei) }

end; { proc .... }
 
  • Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? Beitrag #4
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Kleiner Tip, benutze zum Verarbeiten der Zeilen eine String-Liste:
Code:
CSVList := TStringList.Create;
try
  CSVList.LoadFromFile (AFileName);
  for I := 0 to CSVList.Count - 1 do
    // do something with CSVList[I]
finally
  CSVList.Free;
end;
Du brauchst so die Datei gar nicht weiter anfassen, die String-Liste kümmert sich drum.

O Love
 
  • Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? Beitrag #5
frisbee

frisbee

Bekanntes Mitglied
Dabei seit
17.11.2001
Beiträge
3.841
Reaktionspunkte
0
Ort
BC-E
thx o love, doch kannste das mal für mich nen bisschen näher erklären?

bsp. datei sieht so aus wie oben angegeben und heißt test.csv

muss ich da trotzdem noch opendialog ... assignfile etc. verwenden oder wie.

was bewirkt csc.list ...xxx genau?

thx
 
  • Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? Beitrag #6
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
In meinem Beispielcode setzt Du für "AFileName" Deinen durch den OpenDialog geholten Dateinamen ein, also "test.csv".

AssignFile, Reset, etc., fällt weg, die String-Liste macht das alles für Dich. Du hast die komplette Text-Datei zeilenweise in der Liste, auf jede einzelne Zeile kannst Du, wie im Bespiel, per "CSVList" zugreifen. Das ist ein String, nämlich die I. Zeile.

Die Aufbereitung jeder einzelnen Zeile bleibt, aber auch das kann man ändern/optimieren.

O Love
 
  • Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? Beitrag #7
frisbee

frisbee

Bekanntes Mitglied
Dabei seit
17.11.2001
Beiträge
3.841
Reaktionspunkte
0
Ort
BC-E
thx, werds demnächst mal ausprobieren.

ACH o love, kommst du bitte zu mir in den unterricht ... als lehrer:)
 
  • Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? Beitrag #8
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Warum nicht? Das habe ich an meiner alten Schule mal für ein halbes Jahr gemacht. ;)

O Love
 
  • Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren? Beitrag #9
S

Svenche

Bekanntes Mitglied
Dabei seit
30.04.1999
Beiträge
471
Reaktionspunkte
0
Ort
Erfurt, Deutschland
Hmm, zu spät gelesen, war OLove schneller.
Aber um das mal zu komplettieren, die liste läßt sich ganz leicht dann zeilenweise lesen mittels der eigenschaft count.

also wenn die liste "liste" heißt, kannst du die zeilen so lesen:

for i:=0 TO list.count-1 do begin
... mach was mit der zeile mittels list
end;
 
Thema:

Delphi problem -> Datei auslesen, in tabelle einlesen, wie zeilenende definieren?

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben