Announcement

Collapse
No announcement yet.

Grosse Datein in StringGrid laden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Grosse Datein in StringGrid laden

    Hallo an alle
    Da ich mich noch nicht sehr lange mit der Programmierung in Delphi beschäftige, hätte ich eine Frage zu der Stringgrid Komponente.
    Ich habe eine Datei die ca. 23MB (170.000 Zeilen) groß ist, und ich sollte diese Datei in einer Stringgrid Komponente importieren. Um in den einzelnen
    Zeilen und Spalten nach bestimmten Zeichenfolgen zu suchen.

    Die Datei wird so eingelesen:
    ****************************************
    begin
    Herbaliste := TStringlist.Create;
    Herbaliste.LoadFromFile ('Herbalist.txt');
    ...

    for i := 0 to Herbaliste.Count -1 do
    begin
    Herbatemp := Copy ( Herbaliste.Strings[i], 1, 9 );
    SG_herba.Cells[1,i] := HerbaTemp;
    Herbatemp := Copy ( Herbaliste.Strings[i], 10, 28 );
    SG_herba.Cells[2,i] := HerbaTemp;
    Herbatemp := Copy ( Herbaliste.Strings[i], 39, 8 );
    SG_herba.Cells[3,i] := HerbaTemp;
    Herbatemp := Copy ( Herbaliste.Strings[i], 49, 3 );
    SG_herba.Cells[4,i] := HerbaTemp;
    Herbatemp := Copy ( Herbaliste.Strings[i], 53, 6 );
    SG_herba.Cells[5,i] := HerbaTemp;
    Herbatemp := Copy ( Herbaliste.Strings[i], 60, 8 );
    SG_herba.Cells[6,i] := HerbaTemp;
    Herbatemp := Copy ( Herbaliste.Strings[i], 69, 8 );
    SG_herba.Cells[7,i] := HerbaTemp;
    Herbatemp := Copy ( Herbaliste.Strings[i], 78, 18 );
    SG_herba.Cells[8,i] := HerbaTemp;
    Herbatemp := Copy ( Herbaliste.Strings[i], 97, 25 );
    SG_herba.Cells[9,i] := HerbaTemp;
    Herbatemp := Copy ( Herbaliste.Strings[i], 123, 10 );
    SG_herba.Cells[10,i] := HerbaTemp;
    SG_Herba.RowCount := i +1;
    end;
    end;

    ...
    ***************************************

    Um die ganze Datei einzulesen benötige ich aber sehr viel Zeit (ca. 4 Min)
    und viel Speicher (ca. 180 MB Realer und/oder Virtueller Speicher)

    Meine Frage: gibt es eine Möglichkeit diese Datei so einzulesen das der
    bedarf an Zeit und Speicher (sollte auf einem P233 MMX und 32 MB Speicher laufen)
    so gering wie möglich ist. Es sollte aber nicht mit der DBStringGrid Komponente
    geschehen, da nur Textdatein mit Komma automatisch einlesen werden.
    Die original Datei sollte auch nicht verändert werden.

    Danke schon im voraus für die Hilfe

  • #2
    Hallo, zunächst einmal würde ich die unnötigen Copy-Runden rauswerfen:

    begin
    Herbaliste := TStringlist.Create;
    Herbaliste.LoadFromFile ('Herbalist.txt'); ...
    for i := 0 to Herbaliste.Count -1 do begin
    with SGHerba do begin
    Cells[1,i] := Copy ( Herbaliste.Strings[i], 1, 9 );
    Cells[2,i] := Copy ( Herbaliste.Strings[i], 10, 28 );
    .
    .
    .
    SG_herba.Cells[10,i] := Copy ( Herbaliste.Strings[i], 123, 10 );
    end;
    SG_Herba.RowCount := i +1;
    end;
    end;

    Allerdings sieht selbst das bei 170.000 Zeilen ziemlich müde aus. Teste mal die Möglichkeit, den BDE-Text-Datei-Treiber zum Füllen einer Datenmenge (TTable) zu nutzen.
    MfG Jürge

    Comment


    • #3
      Wie man es schneller machen könnte dazu fällt mir auch nichts ein, aber um Speicherplatz zu sparen würde ich auf die StringListe verzichten. TStringList bietet zwar per 'LoadFromFile' eine bequeme Methode um Dateien einzulesen, aber du hast dadurch den Inhalt der Datei zweimal im Hauptspeicher. Einmal in der StringListe und einmal im StringGrid.<p>
      Ich würde die Datei mit readln zeilenweise lesen und so das StringGrid füllen. Schneller wird's dadurch nicht, es sei denn die Datei ist so groß, daß schon ausgelagert wird.<p>
      Da ich auch öfters ein StringGrid verwende und es mir einfach nicht effektiv scheint, wenn man Strings schon in einem Objekt, z.B. gerade in einer StringListe, verwaltet, diese zur Anzeige im StringGrid nochmals kopieren muß. Es wäre sinnvoller, wenn ich der Zelle eines StringGrids nicht einen String zuweisen könnte, sondern nur einen Zeiger auf einen String. <br>
      Deshalb meine Frage: Kennt jemand eine Komponente, die wie ein StringGrid arbeitet, allerdings mit Zeigern auf Strings?
      <p>
      Mfg
      <p>
      Wolfgang Rolle

      Comment


      • #4
        Hallo Wolfgang,
        <p>
        schau Dir mal die TDrawGrid-Komponente an!
        <P>Tschüß
        <p>
        Torste

        Comment


        • #5
          Hallo Torsten, <p>
          danke für deinen Hinweis. Ich hatte mir die TDrawGrid-Komponente bisher noch nicht so genau angeschaut, da ich angenommen hatte, daß sie zwar Strings anzeigen könnte, aber nicht editieren könnte. Aber im Buch "Delphi 3" von Elmar Warken steht's wie es geht. <p>
          Gruß<p>
          Wolfgang Rolle

          Comment


          • #6
            Hallo Ragim,

            bei großen Textdateien mit fester Struktur (z.B. Semikolon-Trennung) verwende ich in der Regel eine temporäre Tabelle und fülle diese mittels "BatchMove".
            Vorteil hierbei ist, dass das Lesen SEHR!! schnell erfolgt und ggf. kann auch auf jedes Feld ein Index definiert werden...!

            Überleg's Dir mal

            mfg Holge

            Comment

            Working...
            X