Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList - Listenindex überschreitet maximum (https://www.delphipraxis.net/24245-tstringlist-listenindex-ueberschreitet-maximum.html)

Michael80 18. Jun 2004 11:28


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;

Stevie 18. Jun 2004 11:58

Re: TStringList - Listenindex überschreitet maximum
 
Zitat:

Zitat von Michael80
Seltsam ist, wenn ich ca. 150 zeilen (zwischen 1530 und 1698) rauslösch dann lauft er ganz durch :gruebel:

Also liegt es schonmal nicht am Code, sondern an deiner Datei. Hast du schon versucht, einfach andere Zeilen zu löschen? Funktioniert es dann? Wenn nicht, dann versuch doch, die Zeile zu lokalisieren, wo das Problem auftritt.

Btw: Es kann auch sein, dass dort ein , zuviel steht...

shmia 18. Jun 2004 12:09

Re: TStringList - Listenindex überschreitet maximum
 
Du muss deine Daten aus der Datei etwas vorbehandeln:
Delphi-Quellcode:
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('');
Übrigens: IBQuery1.SQL.Text nur einmal ausserhalb der Schleife zuweisen und IBQuery1.close auch wegglassen.

Robert_G 18. Jun 2004 12:58

Re: TStringList - Listenindex überschreitet maximum
 
OffTopic:

Zitat:

die ganze datei hat 2398
Dann sind das ...
Delphi-Quellcode:
    ...
    for ndx := 0 to Pred (mastersl.Count) do
    begin
      ...
      IBTransaction1.Commit;
    end;
2398 Transaktionen!!!!!

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;

Michael80 19. Jun 2004 11:14

Re: TStringList - Listenindex überschreitet maximum
 
Zitat:

Zitat von shmia
Du muss deine Daten aus der Datei etwas vorbehandeln:
Delphi-Quellcode:
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

sobald ich diese zeilen einfüge bringt er mir zum schluss ne zugriffsverletzung
Zitat:

Zitat von shmia
Delphi-Quellcode:
 
   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('');
Übrigens: IBQuery1.SQL.Text nur einmal ausserhalb der Schleife zuweisen und IBQuery1.close auch wegglassen.

perfekt das wars, er hat da immer ein feld zu wenig bekommen :)

@Robert, jo hab ich übersehen, werds ändern!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz