Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi .txt von einem ftp server auslesen (https://www.delphipraxis.net/111428-txt-von-einem-ftp-server-auslesen.html)

Klaus01 3. Apr 2008 13:24

Re: .txt von einem ftp server auslesen
 
Wie schaut denn Deine Datei aus?
Ist es ein csv Text?

Grüße
Klaus

5etH 3. Apr 2008 14:04

Re: .txt von einem ftp server auslesen
 
das ist eine datei in der die datensätze sequentiell abgespeichert werden

Beispiel:
6 <- colcount
3 <- rowcount
KundenNr
1
2
Name
müller
fischer
Vorname
peter
hans
Email
test1@test.de
test2@test.de
Key
5673325273-7456766323-7433227665
5437767477-3652344723-5633225447
Regestriert
0
0

Klaus01 3. Apr 2008 14:29

Re: .txt von einem ftp server auslesen
 
Code:
6 <- colcount
3 <- rowcount
KundenNr


Name
müller
fischer
Vorname
peter
hans
Email
[email]test1@test.de[/email]
[email]test2@test.de[/email]
Key
5673325273-7456766323-7433227665 
5437767477-3652344723-5633225447 
Regestriert

0
Ich würde vorschlagen die Datei etwas anders zu gestalten:
1. Zeile KundenNr;Name;Vorname;Email;Key;Registriert
2. Zeile 1;müller;peter;test1@test.de;56...;0
...

Dann fällt die Sache mit dem Einlesen deutlich leichter:


Ein StringGrid In ein csv Format zu speichern geht so:
Delphi-Quellcode:
var
  csv : TStringList;
begin
  csv := TstringList.create;
  csv.Delimiter:=';';
  for i:=0 to StringGrid1.RowCount -1 do
    begin
      StringGrid1.Rows[i].Delimiter:=';';
      csv.Add(StringReplace(StringGrid1.Rows[i].CommaText,',',';',[rfReplaceAll]));
    end;
  csv.SaveToFile(<FileName>);
  csv.Free;
end;
Ein Import sollte so gehen:

Delphi-Quellcode:
var
  csv : TStringList;
begin
  csv := TStringList.create;
  csv.loadfromStream(DB);
  stringGrid1.rowCount := sl.count;
 
  for i:=0 to sl.count -1 do
    begin
      StringGrid1.Rows[i].Delimiter:=';';
      StringGrid1.Rows[i].Commatext:=sl[i];
    end;
  csv.free;
end;
Grüße
Klaus

5etH 3. Apr 2008 14:48

Re: .txt von einem ftp server auslesen
 
das funktioniert an sich schonmal... Danke.... nur habe ich das Problem das ich es auf zwei arten laden und speichern muss.
einmal in einem Stream damit die kunden nicht rankommen. zum administrieren der Accounts arbeiten wir mit der selben DB, die aber teils Lokal gepsiechert werden muss.

sprich ich bräuchte dann auch eine procedure um das lokal speichern und laden zu können.

du musst sie nicht für mich schreiben, aber kann ja sein du hast schon eine ...


asl omein lokaler ladeaufruf sieht jetzt so aus aber er meckert noch mit dem count

Delphi-Quellcode:
procedure loadgrid(StringGrid: TStringGrid; const FileName: TFileName);
var
  csv : TStringList;
  i : Integer;
begin
  csv := TStringList.create;
  csv.loadfromfile('c:\DB\DB.txt');
  stringGrid.rowCount := csv.count;
  for i:=0 to csv.count -1 do      
    begin
    StringGrid.Rows[i].Delimiter:=';';
    StringGrid.Rows[i].Commatext:=csv[i];
    csv.free;
    end;
end;

Nuclear-Ping 3. Apr 2008 14:58

Re: .txt von einem ftp server auslesen
 
Hä? Wie du speicherst und lädst hat doch Klaus gezeigt?

Und außerdem: Wie wäre es, wenn du mal eine richtige (Embedded-)Datenbank benutzt, statt solche selbstgebastelten Text-Dateien "DB" zu nennen und in einem Atemzug auch noch von "Sicherheit" zu sprechen?

[edit]
stringGrid.rowCount := tstringlist.count;//Auf

Hirn einschalten?

Du definierst "csv" als TStringList, erzeugst es auch so, lädst die Datei auch so ... aber dann willste aufeinmal von der Klassendeklaration auf .Count zugreifen ... Allet klar. ;)
[/edit]

5etH 3. Apr 2008 15:06

Re: .txt von einem ftp server auslesen
 
das mit dem csv ist mir eben auch aufgefallen ^^ ich seh die letzten tage nur delphicode ^^ kann verwirren

zum andern sie ist noch in der testphase und heist nur db weils sich schneller schreiben lässt....

an klasu nochmal vielen dank problem ist gelöst und es funktioniert alles

5etH 3. Apr 2008 15:47

Re: .txt von einem ftp server auslesen
 
so nochmal zum eigentlich stream in stringgrid lesen ...

mein aufruf sieht so aus
Delphi-Quellcode:
var
    DB : TMemoryStream;
    csv : TStringList;
    i : Integer;
begin

  DB := TMemoryStream.create;

  datenmodul1.idftp1.Username := 'proguser';
  datenmodul1.idftp1.Password := 'manuel13';
  datenmodul1.idftp1.Host := '10.15.121.106';
  datenmodul1.idftp1.Connect;
  datenmodul1.IdFTP1.ChangeDir('/Kunden/');
  datenmodul1.idftp1.Get('/Kunden/DB2.txt', DB);
   
    csv := TStringList.create;
    csv.loadfromStream(DB);
    stringGrid1.rowCount := csv.count;

  for i:=0 to csv.count -1 do
    begin
      StringGrid1.Rows[i].Delimiter:=';';
      StringGrid1.Rows[i].Commatext:=csv[i];
    end;
  csv.free;
doch leider lädt er die Datensätze nicht in das Grid ein es bleibt leer... er verändert etwas, (Die fixed Cols verschwinden der fixed Row bleibt) aber es wird kein text eingefügt die quelldatei ist aber richtig

[EDIT] Beim lokalen speicher geht alles klar nur wenn ich lokal laden will sagt er mir das: Listenindex überschreitet das Maximum (1)

wie kann ich das beheben und hängt es vill mit dem oben genannten zusammen ?

Klaus01 3. Apr 2008 16:18

Re: .txt von einem ftp server auslesen
 
Kann es sein, dass Dein Stream leer ist?
Delphi-Quellcode:
datenmodul1.IdFTP1.ChangeDir('/Kunden/');
datenmodul1.idftp1.Get('/Kunden/DB2.txt', DB);
Oder setze mal nachdem der Stream geladen wurde die Position des Streams auf 0.
Delphi-Quellcode:
DB.position:=0;
Grüße
Klaus

5etH 3. Apr 2008 16:21

Re: .txt von einem ftp server auslesen
 
also das zurücksetzten ist sinnlos und ich denke nicht das DB leer ist da er sich ja die datei zieht und auch im debugger kein "()" angezeigt wird ...

Klaus01 3. Apr 2008 20:33

Re: .txt von einem ftp server auslesen
 
Delphi-Quellcode:
var
  kundenStream : TMemoryStream;
  csv : TStringList;
  i: Byte;
begin
  edit1.Text:= idftp1.Version;
  kundenStream := TMemoryStream.Create;
  idftp1.Host:='192.168.189.128';
  idftp1.Username:='...';
  idftp1.Password:='...';

  idftp1.Connect();
  idftp1.Get('kunden.csv',kundenStream);
  idftp1.Disconnect;
  csv := TStringList.create;
  kundenStream.Position:=0;      
  csv.loadfromStream(kundenStream);
  stringGrid1.rowCount := csv.count;

  for i:=0 to csv.count -1 do
    begin
      StringGrid1.Rows[i].Delimiter:=',';
      StringGrid1.Rows[i].Commatext:=csv[i];
    end;
  csv.free;
  kundenStream.Free;
So, der obige Code funktioniert bei mir.
Wenn der Stream nicht auf die Position 0 gesetzt wird,
gibt es eine ListIndex out of bounds Fehlermeldung.

Was ich weiter noch festgestellt habe, ist dass
wenn die Datensätze mit ; getrennt und aus dem Stream gelesen werden
sind diese nicht richtig in das StringGrid eingelesen worden.
Es stehen alle Daten in Spalte 0 des StringGrids.

Werden die Datensätze mit , getrennt
werden sie auch richtig in das StringGrid aufgenommen.

Ich habe mit diesen Datensätzen getestet:
Code:
KundenNr,Name,Vorname,Email
1,Beck,Rufus,test1@123.com
2,Maier,Dieter,test2@456.net
Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr.
Seite 2 von 3     12 3      

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