Autor Beitrag
Hänsel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 148



BeitragVerfasst: Gestern um 07:15 
Hallo, kann jemand helfen ?
Ich arbeite mit Delphi 10.
Ich möchte eine .csv-Datei in eine Datenbank schreiben.
Bekomme aber ständig die Fehlermeldung: "Listenindex außerhalb gültigen Bereich"
Was habe ich hier vergessen bzw. falsch gemacht?

procedure TForm_RWM.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
AssignFile(tfDatei, sFile);
Reset(tfDatei);
slWerte := TStringList.Create;
slWerte.StrictDelimiter:=true;
slWerte.Delimiter := #9;
slWerte.DelimitedText := sZInhalt;
slWerte.QuoteChar := ';';
Readln(tfDatei,sZInhalt);
inc(iZeile);
// slWerte.QuoteChar := '"';
iZeile:= 0;
while not EoF(tfDatei) do
begin
Inc(iZeile); // erste Zeile ist der Kopf
if iZeile > 5 then // alles größer als Zeile eins sind Daten
begin
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM.Open;
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM.Last;
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM.Append;
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM.Edit;
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM['Feld_01']:='Test';
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM['Feld_02'] := slWerte.Strings[2];
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM['Feld_02'] := slWerte.Strings[4];
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM['Feld_03'] := slWerte.Strings[7];
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM['Feld_04'] := slWerte.Strings[8];
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM['Feld_05'] := slWerte.Strings[9];
DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM.Post;
end;
end;
zähler:= DataModule_RWM_Auswertung.ADOQuery_Einlesung_RWM.RecordCount;
Edit1.Text:=inttoStr(zähler);

End;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Gestern um 08:35 
Du weist den Wert sZInhalt (noch leer) der Stringliste slWerte zu und liest den Wert erst danach aus der Datei:
ausblenden Delphi-Quelltext
1:
2:
3:
slWerte.DelimitedText := sZInhalt;
slWerte.QuoteChar := ';';
Readln(tfDatei,sZInhalt);
Dazu kommt, dass du in der Schleife gar nicht mehr aus der Datei liest.

Du solltest dir vielleicht erst einmal überlegen, was du in welcher Reihenfolge machen musst, ohne Quelltext. Und danach dann schauen, wie du das umsetzt. Das ist kein Programmierproblem, sondern ein Logikproblem!

Nebenbei:
Warum lädst du nicht einfach alles in eine Stringlist und gehst dann zeilenweise durch deren Werte durch? Sprich dann hättest du zwei Stringlisten, eine für die Datei und eine für die einzelne Zeile.
Hänsel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 148



BeitragVerfasst: Gestern um 11:11 
Danke für die Hinweise.
Da mir hier offensichtlich die Kenntnisse fehlen, wäre es schön ein Grundgerüst an Code zu bekommen. So dass ich die Vorgehensweise nachvollziehen kann.

Danke im Voraus
Hänsel
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1748

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Gestern um 13:01 
Die wichtigste Frage ist erst einmal, ob das eine Aufgabe für einen Schulunterricht oder ähnliches ist? Denn im Code kommen Dinge vor wie die ungarische Notation (sl für Stringliste usw. bei den Variablen), die in Delphi absolut unüblich sind, die aber niemand einfach so macht. Denn wenn du eine bestimmte Aufgabenstellung hast, hilft dir eine andere Lösung vielleicht gar nicht weiter.

Zeilenweise geht z.B. so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  i: Integer;
  slDatei: TStringList;
begin
  slDatei := TStringList.Create;
  slDatei.LoadFromFile(sFile);
  for i := 0 to slDatei.Count - 1 do
    ShowMessage(slDatei[i]);
...

Für diesen Beitrag haben gedankt: Hänsel
Hänsel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 148



BeitragVerfasst: Gestern um 13:19 
Nein das ist nicht für die Schule.
Ich möchte für einige Rauchwarnmelder welche funken, die ecsv-Datei in eine Datenbank schreiben.
Hänsel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 148



BeitragVerfasst: Heute um 09:07 
Zu meiner oben gestellten Frage habe ich folgendes herausgefunden: Wenn ich nach den Einstellungen eine .csv Datei einlesen möchte, gibt es eine Fehlermeldung wie beschreiben. Wenn ich eine .rep Datei einlesen möchte, klappt bestens. Welche Voreinstellung habe ich vergessen bzw. falsch gemacht?

Gruß Hänsel