AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TStringList - Listenindex überschreitet maximum
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList - Listenindex überschreitet maximum

Ein Thema von Michael80 · begonnen am 18. Jun 2004 · letzter Beitrag vom 19. Jun 2004
Antwort Antwort
Michael80

Registriert seit: 20. Nov 2003
Ort: Treuchtlingen
72 Beiträge
 
Delphi 10.3 Rio
 
#1

TStringList - Listenindex überschreitet maximum

  Alt 18. Jun 2004, 11:28
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

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;
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

Re: TStringList - Listenindex überschreitet maximum

  Alt 18. Jun 2004, 11:58
Zitat von Michael80:
Seltsam ist, wenn ich ca. 150 zeilen (zwischen 1530 und 1698) rauslösch dann lauft er ganz durch
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...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: TStringList - Listenindex überschreitet maximum

  Alt 18. Jun 2004, 12:09
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.
Andreas
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

Re: TStringList - Listenindex überschreitet maximum

  Alt 18. Jun 2004, 12:58
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;
  Mit Zitat antworten Zitat
Michael80

Registriert seit: 20. Nov 2003
Ort: Treuchtlingen
72 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: TStringList - Listenindex überschreitet maximum

  Alt 19. Jun 2004, 11:14
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 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!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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