| Autor | Beitrag | 
| Hänsel 
          Beiträge: 152
 
 
 
 
 | 
Verfasst: So 23.02.20 09:35 
 
Kann hier jemand weiterhelfen?
 das Einlesen der csv-Datei funktioniert eigentlich ganz ordentlich aber die letzte Zeile wird grundsätzlich nicht mit Eingelesen. Was habe ich da vergessen bzw. falsch gemacht.
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 
 | procedure TForm_M_Satz_Einlesung.Import1FromCSVfile(sFile: string);var
 ON,su,aus,be: string;
 tb,zah: Integer;
 
 tfDatei: TextFile;
 sZInhalt,D,ob : string;
 slWerte: TStringList;
 iZeile,zähler: Integer;
 begin
 Try
 Try
 AssignFile(tfDatei, sFile);
 Reset(tfDatei);
 iZeile:= -1;
 while not EoF(tfDatei) do
 begin
 slWerte := TStringList.Create;
 slWerte.StrictDelimiter:=true;
 slWerte.Delimiter := #9;
 slWerte.DelimitedText := sZInhalt;
 Readln(tfDatei,sZInhalt);
 Inc(iZeile);          if iZeile > 0 then            begin
 DataModule1.ADOQuery_M_Satz.Open;
 DataModule1.ADOQuery_M_Satz.Append;
 DataModule1.ADOQuery_M_Satz.Edit;
 DataModule1.ADOQuery_M_Satz['Zeile']:=slWerte.Strings[0];
 end;
 DataModule1.ADOQuery_M_Satz.Edit;
 DataModule1.ADOQuery_M_Satz.Post;
 end;
 Finally
 End;
 Finally
 
 End;
 End;
 |  Danke im Voraus
 Hänsel
Moderiert von  Th69: Delphi-Tags hinzugefügt | 
|  | 
| Sinspin 
          Beiträge: 1335
 Erhaltene Danke: 118
 
 Win 10
 RIO, CE, Lazarus
 
 | 
Verfasst: So 23.02.20 12:31 
 
Hallo. Verwende doch einfach zwei Stringlisten. Eine für die Datei, die dann die Zeilen enthält, so ist jede Zeile ein Record. 
Und eine zweite die dann eine Zeile nach der anderen erhält um jeweils das CSV aufzudröseln, wie Du es ja schon machst.
 Dann sind auch alle Probleme weg die sich sonst bei MBCS (Multi Byte Char Sets) ergeben würden.
 _________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
 | 
|  | 
| ub60 
          Beiträge: 764
 Erhaltene Danke: 127
 
 
 
 
 | 
Verfasst: So 23.02.20 12:33 
 
Kann es sein, dass in der letzten Zeile der CSV-Datei ein LineFeed bzw. CR fehlt?
 Dann würde readln die letzte Zeile nicht mit einlesen.
 Vorschlag 2: Verwende zum Einlesen auch eine StringListe. (Edit: Sispin war schneller     )
 ub60 | 
|  | 
| Hänsel  
          Beiträge: 152
 
 
 
 
 | 
Verfasst: So 23.02.20 14:41 
 
Hallo
Danke für die Hinweise.
 Ich habe mit Stringlisten noch nichts gemacht. Könnte ich eventuell ein Beispiel für mein Problem von Euch bekommen? Wäre super.
 
 
 Hänsel
 | 
|  | 
| Gausi 
          Beiträge: 8550
 Erhaltene Danke: 478
 
 Windows 7, Windows 10
 D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
 
 | 
Verfasst: So 23.02.20 15:13 
 
Das sollte in etwa so gehen:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 
 |   StringListDatei := TStringList.Create;try
 StringListDatei.LoadfromFile(sFile);
 for i := 0 to StringListDatei.Count - 1 do
 begin
 end;
 finally
 StringListDatei.Free;
 end;
 |  Wenn die Dateien sehr groß sind (so ab ein paarhundert MB), bekommst du hier allerdings ggf. ein Speicherproblem._________________ We are, we were and will not be.
 | 
|  | 
| Hänsel  
          Beiträge: 152
 
 
 
 
 | 
Verfasst: So 23.02.20 15:47 
 
Hallo,
Danke für den Hinweis.
 Hänsel
 | 
|  | 
| icho2099 
          Beiträge: 101
 Erhaltene Danke: 12
 
 WIN XP, WIN 7, WIN 10
 Delphi 6 Prof, Delphi 2005, FPC
 
 | 
Verfasst: Mo 24.02.20 07:43 
 
Du erzeugst in der while Schleife bei jedem Durchlauf eine neue Stringlist, und du weist dieser dann die Zeile zu, die du im vorherigen Durchlauf gelesen hast. Der letzte Durchlauf liefert dir keinen Input in die Stringlist.
 Natürlich sollte die Stringlist vor der Schleife erstellt und in der Schleife gefüllt und wieder geleert werden. Und nach der Schleife das Aufräumen nicht vergessen.
Moderiert von  Th69: Beitragsformatierung überarbeitet. | 
|  | 
| hRb 
          Beiträge: 297
 Erhaltene Danke: 12
 
 
 
 
 | 
Verfasst: Sa 14.03.20 14:10 
 
Hallo Hänsel,
ich arbeite relativ viel mit csv-Dateien. Da gibt es noch deutlich mehr Fallstricke die zu beachten sind und meine selbstgestrickte Einleseroutine ist recht umfangreich. Beispiele:
 1. csv-dateien haben nicht selten innerhalb eines Teiltextes noch Zeilenumbruch-Steuerzeichen, also #0D, #0A. Dann wird der Text oft in Doppel-Hochkomma "....." gesetzt. Die normale readln-Funktion erkennt dies nicht, d.h. Du bekommst ungewollt eine neue Zeile und die Tabellen-Struktur wird falsch.
 2. Bei csv sind mehrere Trennzeichen erlaubt , z.B Tab ; | etc.. Auch dies muss vorab eingestellt oder autom. erkannt werden (Strukturanalyse).
 Wenn Du also ganz allgemein csv-Dateien selbst einlesen möchtest, musst Du Dich intensiv mit den Regeln des csv-Formats beschäftigen. Überlege mit Excel zu öffnen und von dort Daten übernehmen.
 3. Aber auch wenn Du dies tust kanns Probleme geben. Ich arbeite z.B. häufig mit einer csv-Exportdatei einer kirchlichen Datenbank. Wird dort unter der Spalte "Kirchenbuch/Seite" z.B. der Text 2/7 eingetragen, was bedeuten soll KirchenbuchNr 2, Seite 7, so interpretiert Excel dies als Datum 02.07.2020 (aktuellesJahr).
 Es gibt also genug Fehlermöglichkeiten.
 hRb
 | 
|  | 
| hRb 
          Beiträge: 297
 Erhaltene Danke: 12
 
 
 
 
 | 
Verfasst: Mi 18.03.20 20:54 
 
Hallo Hänsel,
noch ein Nachtrag.
 Du hast vor 7 Monaten schon einmal eine Frage zum Einlesen von csv-Dateien gestellt. Du schreibst dort, nachdem Du eine Reihe von Hinweisen bekommen hast, dass die Frage gelöst sei. Danach wird nachgefragt wie denn die Lösung war.
 1. Die Frage ist nach wir vor im Forum als "Offen" , also ungelöst markiert. VERGESSEN?
 2. Du hast, obwohl man Dir Hilfetipps gegeben hat, nicht mehr geantwortet wie die Lösung war.
 Nun stellst Du unter gleichem Stichwort die nächste Frage. Ich finde, wer Fragen stellt, sollte den Dialog auch zu Ende bringen, damit andere auch etwas davon haben. Wäre doch bei so viel ehrenamtlichen Einsatz eigentlich fair.
 Gruß hRb
 | 
|  |