![]() |
.txt von einem ftp server auslesen
Hallo Zusammen,
Ich habe auf einem FTP Server eine Kundendatenbank mit Seriennummern für die Programme. Ich würde jetzt gerne diese Datenbank in ein Stringgrid speichern ohne das die .txt datei lokal gespeichert wird. Das ganze dient zur regestrierung des Programms. Ist das denn möglich, und wenn ja wie, oder gibt es eine andere Möglichkeit, wenn sie lokal gespeichert werden muss, diese vor fremden Zugriffen zu schützen, da ja dort alle Kunden verzeichnet sind. Vielen Dank schonmal euer Manu |
Re: .txt von einem ftp server auslesen
Hallo,
mit indy ftp kanst Du in einen Stream (MemoryStream) speichern. Den MemoryStream kannst Du in die Stringlist laden TStringList.loadfromStream. Grüße Klaus |
Re: .txt von einem ftp server auslesen
danke das werde ich mal ausprobieren
|
Re: .txt von einem ftp server auslesen
du meinst doch die IdIOhandlerStream1 Komponente oder ?
|
Re: .txt von einem ftp server auslesen
Zitat:
Zitat:
Klaus |
Re: .txt von einem ftp server auslesen
joa das hab ich jetzt benutzt und bin am testen bekomme aber eine fehlermeldung
Fehlermeldung: TStream.seek nicht implementier Programmfragment :
Delphi-Quellcode:
kann mir da vielleicht jemand weiterhelfen
procedure TReg.Button1Click(Sender: TObject);
var DB : Tstream; begin //... db := Tstream.Create; datenmodul1.idftp1.Username := 'proguser'; datenmodul1.idftp1.Password := 'manuel13'; datenmodul1.idftp1.Host := '10.15.121.106'; datenmodul1.idftp1.Connect; datenmodul1.idftp1.Get('/DB.txt', DB, true); datenmodul1.idftp1.Disconnect; |
Re: .txt von einem ftp server auslesen
Wie immer wäre es gut die Fehlermeldung auch anzugeben.
Hast Du ja, habe ich übersehen. Aber bei der get Version mit dem Stream gibt es die Option override nicht. Warum definierst Du nicht:
Delphi-Quellcode:
Grüße
DB : TMemoryStream;
DB:= TMemoryStream.create; Klaus |
Re: .txt von einem ftp server auslesen
wird bei dem einladen der DB.txt der inhalt der datei oder die datei an sich in den stream geladen ?
|
Re: .txt von einem ftp server auslesen
Zitat:
Wenn Du idftp.get('\DB.txt',DB); ausführst wird der Inhalt der DB.txt in den Stream geladen. Grüße Klaus |
Re: .txt von einem ftp server auslesen
also wenn der inhalt eingelesen wird habe ich ja eine menge strings... aber wenn ich diese z.B. in ein gird laden will sind das ja inkompatible typen.... wie kann ich diese konvertieren
|
Re: .txt von einem ftp server auslesen
Wie schaut denn Deine Datei aus?
Ist es ein csv Text? Grüße Klaus |
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 test1@test.de test2@test.de Key 5673325273-7456766323-7433227665 5437767477-3652344723-5633225447 Regestriert 0 0 |
Re: .txt von einem ftp server auslesen
Code:
Ich würde vorschlagen die Datei etwas anders zu gestalten:
6 <- colcount
3 <- rowcount KundenNr 1 2 Name müller fischer Vorname peter hans [email]test1@test.de[/email] [email]test2@test.de[/email] Key 5673325273-7456766323-7433227665 5437767477-3652344723-5633225447 Regestriert 0 0 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:
Ein Import sollte so gehen:
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;
Delphi-Quellcode:
Grüße
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; Klaus |
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; |
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] |
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 |
Re: .txt von einem ftp server auslesen
so nochmal zum eigentlich stream in stringgrid lesen ...
mein aufruf sieht so aus
Delphi-Quellcode:
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
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; [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 ? |
Re: .txt von einem ftp server auslesen
Kann es sein, dass Dein Stream leer ist?
Delphi-Quellcode:
Oder setze mal nachdem der Stream geladen wurde die Position des Streams auf 0.
datenmodul1.IdFTP1.ChangeDir('/Kunden/');
datenmodul1.idftp1.Get('/Kunden/DB2.txt', DB);
Delphi-Quellcode:
Grüße
DB.position:=0;
Klaus |
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 ...
|
Re: .txt von einem ftp server auslesen
Delphi-Quellcode:
So, der obige Code funktioniert bei mir.
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; 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:
Grüße
KundenNr,Name,Vorname,Email
1,Beck,Rufus,test1@123.com 2,Maier,Dieter,test2@456.net Klaus |
Re: .txt von einem ftp server auslesen
hallo nochmal ... hab noch eine letzte frage :cry:
ich habe jetzt den kundendatensatz ein ein unsichtbares grid gepackt (Stringgrid2) und würde es nun gerne per stream wieder an den server senden, mein problem: wie bekomme ich die datensätze des Grids in den Stream, sodass sie wieder mit , in dem csv getrennt sind. so weit bin ich schon gekommen:
Delphi-Quellcode:
if (right) then // Right gibt an ob alle felder zur account erstellung ausgefüllt sind
begin for b := 0 to stringgrid1.rowcount - 1 do begin if (keyganz = stringgrid1.cells[4,i]) and (Stringgrid1.Cells[5,i] = '0') then //wenn Key in datenbank und noch nicht benuzt begin //Einloggen datenmodul1.idftp1.Username := 'proguser'; datenmodul1.idftp1.Password := 'manuel13'; datenmodul1.idftp1.Host := '10.15.121.106'; datenmodul1.idftp1.Connect; //Lokale Tabellen stringgrid1.Cells[5,i] := '1'; Stringgrid2.Cells[1,stringgrid2.rowcount] := edit4.text; Stringgrid2.Cells[2,stringgrid2.rowcount] := edit5.text; Stringgrid2.Cells[2,stringgrid2.rowcount] := keyganz; stringgrid2.RowCount := Stringgrid2.rowcount +1; save := TMemoryStream.create; csv2 := TStringList.create; save.position:=0; for x := 0 to Stringgrid2.rowcount - 1 do begin //Inahlt fehlt <-- wie sieht der schleifen inhalt zum speichern aus end; csv2.savetoStream(save); csv2.free; save.Free; //Auf server Speichern und disconnecten datenmodul1.IdFTP1.ChangeDir('/Kunden/'); datenmodul1.IdFTP1.Put(save,ExtractFileName('Kundendatenbank.csv')); datenmodul1.IdFTP1.Disconnect; end; end; end; |
Re: .txt von einem ftp server auslesen
Delphi-Quellcode:
War aber so ähnlich schon in diesem Thread aufgeführt.
var
csv : TStringList; begin csv := TstringList.create; csv.Delimiter:=','; for i:=0 to StringGrid1.RowCount -1 do begin StringGrid1.Rows[i].Delimiter:=','; csv.Add(StringGrid1.Rows[i].CommaText) end; csv.SaveToStream(<Stream>); csv.Free; end; Grüße Klaus |
Re: .txt von einem ftp server auslesen
holla que tall ^^
also erst lief es ... jetzt tritt ein fehler auf (Listenindex überschreitet das Maximum(0)) woran kann das liegen? hier einmal der code und wo der fehler auftritt
Delphi-Quellcode:
begin
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/KundenDatenbank.csv', Kundenstream); 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]; //Hier stürzt er ab ! end; csv.free; kundenStream.Free; right := true; |
Re: .txt von einem ftp server auslesen
Delphi-Quellcode:
Vertausche mal diese beiden Zeilen.Kundenstream.position:=0; csv.loadfromStream(Kundenstream); Grüße Klaus |
Re: .txt von einem ftp server auslesen
ist vertauscht aber selber fehler :(
|
Re: .txt von einem ftp server auslesen
Kannst Du Deine Datei mal testweise in ein Memo ausgeben?
Memo1.lines.loadFromFile() und den output hier einstellen. Testen kann ich das erst heute abend wieder. Grüße Klaus |
Re: .txt von einem ftp server auslesen
also ich habe den stream der übergeben wird jetzt mal ausgesleen und der ist leer
Delphi-Quellcode:
aber die datei auf dem server hat den inhalt
Memo1.lines.LoadFromStream(kundenstream);
KundenNr.,Name,Vorname,Email,Key,Regestriert 1,1,1,1,7453343257-7456326365-5637645445,0 2,2,2,2,7673325253-7272764327-3677447245,0 und er lädt die datei auch vom server wenn ich da in die Log schaue [Edit] je nach dem wie ich i in der folgenden schleife erhöhe ändert sich der maximal listindex
Delphi-Quellcode:
for i:=0 to csv.count -1 do
begin StringGrid1.Rows[i].Delimiter:=','; StringGrid1.Rows[i].Commatext:=csv[i]; end; |
Re: .txt von einem ftp server auslesen
hatte das memo1... an der falschen stelle und jetzt lädt er es in das memofeld
inhalt: KundenNr.,Name,Vorname,Email,Key,Regestriert 1,1,1,1,7453343257-7456326365-5637645445,0 2,2,2,2,7673325253-7272764327-3677447245,0 aber er trägt es nicht in das grid ein... immernoch selber fehler |
Re: .txt von einem ftp server auslesen
Hallo Manuel,
ich habe das noch einmal getestet. Ich bekomme nur den Fehler "Listindex out of Bounds" wenn ich den Stream, nachdem er geladen wurde, nicht auf den Anfang (kundenStream.position:=0;) zurückgesetzt habe. Anbei noch einmal beide Routinen zum down- und upload.
Delphi-Quellcode:
Wenn es bei Dir nicht so geht, dann stimmt in Deinem Code irgendetwas nicht.
procedure TForm1.downloadButtonClick(Sender: TObject);
var kundenStream : TMemoryStream; csv : TStringList; i: Byte; begin 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; if csv.count > 0 then for i:=0 to csv.count -1 do begin StringGrid1.Rows[i].Delimiter:=','; StringGrid1.Rows[i].Commatext:=csv[i]; end; csv.free; kundenStream.Free; end; procedure TForm1.uploadButtonClick(Sender: TObject); var kundenStream: TMemoryStream; csv : TStringList; i: Byte; begin kundenStream := TMemoryStream.Create; idftp1.Host:='192.168.189.128'; idftp1.Username:='...'; idftp1.Password:='...'; idftp1.Disconnect; csv := TStringList.create; for i:=0 to StringGrid1.Rowcount -1 do begin csv.Add(StringGrid1.Rows[i].CommaText); end; idftp1.Connect(); csv.SaveToStream(kundenStream); idftp1.put(kundenStream,'kunden.csv'); csv.free; kundenStream.Free; idftp1.disconnect; end; Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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