![]() |
TStringList - Listenindex überschreitet maximum
Hallo Leute, ich krieg noch die krise mit dem einlesen meiner datei
also mit folgender funktion liest er mir ca 1600 zeilen ein und meldet dann Listenindex überschreitet maximum(10). so auf anhieb würd ich sagen er hat zuviele "" und bringt mir zuviel indizes bin aber die datei ab zeile 1585 durchgegangen und mir is nix auser gewöhnliches aufgefallen. Seltsam ist, wenn ich ca. 150 zeilen (zwischen 1530 und 1698) rauslösch dann lauft er ganz durch :gruebel: die ganze datei hat 2398 zeilen. an was könnte das sonst noch liegen?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var masterSL : TStringList; detailSL : TStringList; ndx : Integer; // Laufvariable für Master begin masterSL := TStringList.Create; // Master StringList detailSL := TStringList.Create; // Detail StringList try detailSL.Delimiter := ';'; // Trennzeichen der Einträge pro Zeile detailSL.QuoteChar := '"'; // Quoting Zeichen. masterSL.LoadFromFile('C:\KUNDENSTAMM.txt'); for ndx := 0 to Pred (mastersl.Count) do begin detailsl.Clear; detailsl.DelimitedText := '"' + StringReplace(mastersl.Strings[ndx],';','";"',[rfReplaceAll]); //detailsl.savetofile('c:\test.txt'); with IBQuery1 do begin Close; SQL.Text := 'INSERT INTO KUNDENSTAMM(KDNR, ANREDE, VORNAME, NACHNAME, ZUSATZ, STRASSE,ORTSTEIL,PLZ,ORT,TELEFON,TELEFAX) VALUES (:wert1,:wert2,:wert3,:wert4,:wert5,:wert6,:wert7,:wert8,:wert9,:wert10,:wert11)'; ParamCheck := True; ParamByName('wert1').AsInteger := strtoint(detailsl.Strings[0]); ParamByName('wert2').AsString := detailsl.Strings[1]; ParamByName('wert3').AsString := detailsl.Strings[2]; ParamByName('wert4').AsString := detailsl.Strings[3]; ParamByName('wert5').AsString := detailsl.Strings[4]; ParamByName('wert6').AsString := detailsl.Strings[5]; ParamByName('wert7').AsString := detailsl.Strings[6]; ParamByName('wert8').AsString := detailsl.Strings[7]; ParamByName('wert9').AsString := detailsl.Strings[8]; ParamByName('wert10').AsString := detailsl.Strings[9]; ParamByName('wert11').AsString := detailsl.Strings[10]; ExecSQL; end; IBTransaction1.Commit; end; finally FreeAndNil (mastersl); FreeAndNil (detailsl); end; end; |
Re: TStringList - Listenindex überschreitet maximum
Zitat:
Btw: Es kann auch sein, dass dort ein , zuviel steht... |
Re: TStringList - Listenindex überschreitet maximum
Du muss deine Daten aus der Datei etwas vorbehandeln:
Delphi-Quellcode:
Übrigens: IBQuery1.SQL.Text nur einmal ausserhalb der Schleife zuweisen und IBQuery1.close auch wegglassen.
for ndx := 0 to Pred (mastersl.Count) do
begin s := mastersl.Strings[ndx]; if s= '' then Continue; // leere Zeile überspringen if s[1] = '*' then Continue; // Zeile mit Kommentar überspringen detailsl.Clear; detailsl.DelimitedText := '"' + StringReplace(s,';','";"',[rfReplaceAll]); // du erwartest 11 Felder. Sind es weniger, dann mit Leerstrings auffüllen while detailsl.Count < 11 do detailsl.Add(''); |
Re: TStringList - Listenindex überschreitet maximum
OffTopic:
Zitat:
Delphi-Quellcode:
2398 Transaktionen!!!!!
...
for ndx := 0 to Pred (mastersl.Count) do begin ... IBTransaction1.Commit; end; Wofür soll das denn gut sein? Ich denke mal ein Kompromiss zwischen übergroßen ReDo-tablespaces und 2398 Transaktionen (!!!`) wäre ein Zähler, der dir alle 400-600 Einträge ein Commit ausführt. (Ich habe null Ahnung von IB, also probiere selbst welcher Wert am schnellsten ist ;) )
Delphi-Quellcode:
for ndx := 0 to Pred (mastersl.Count) do
begin ... If RecsInTransact > 500 then begin IBTransaction1.Commit; RecsInTransact := 0; end; inc(RecsInTransact); end; |
Re: TStringList - Listenindex überschreitet maximum
Zitat:
Zitat:
@Robert, jo hab ich übersehen, werds ändern! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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