Announcement

Collapse
No announcement yet.

Text Datei mit festen Feldgrößen einlesen ?

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

  • #31
    Hallo Andreas,

    hier ein wenig Delphicode:

    <pre>
    ...
    var
    il_RowNumber: integer;
    sl: TStringList;
    sl_temp: string;
    sl_Vorname: string;
    sl_Nachname: string;
    begin
    sl := TStringList.Create;
    try
    sl.LoadFromFile('c:\sltest.txt');
    il_RowNumber := 0;
    while il_RowNumber < sl.Count do
    begin
    sl_temp := sl[il_RowNumber];
    sl_Vorname := TrimRight(copy(sl_temp, 1, 15));
    sl_Nachname := TrimRight(copy(sl_temp, 16, 15));
    ...
    inc(il_RowNumber);
    end;
    finally
    sl.Free;
    end;
    end;
    </pre>

    Gruß

    Torste

    Comment


    • #32
      Hallo Torsten,

      ich hab' das Programm auf meinem Arbeitsrechner laufen lassen:

      Erzeugen: 1,11053416006783<BR>
      Speichern: 10,2289553560578

      Button Jochen:<BR>
      Laden: 8,34281228480156<BR>
      Auswerten: 5,13771219526504

      Button Torsten:<BR>
      Laden: 8,09787640607954<BR>
      Auswerten: 3,51226538568449

      Das läßt ja dann darauf schließen, daß Delphi effektiveren Code erzeugt, insbesondere im Speichermanagement. (Ich will es gar nicht wahrhaben...). Um diese Zeiten mit meinem BCB zu erreichen, müßte ich schon tief in die Trickkiste und komplett auf die Verwendung von TStringList und AnsiString verzichten. Insbesondere das Erzeugen dauert nur ein Viertel der Zeit, obwohl der Code doch identisch ist. Falls ich heute noch ein bißchen Zeit finde, werde ich statt TStringList mal eine meiner selbstgeschriebenen Klassen ausprobieren und statt AnsiString mal einen char verwenden.

      Grüße Jochen :

      Comment


      • #33
        Hallo Jochen,

        bei mir hat eine leichte Veränderung an Deinen Sourcen schon ca. 10% Performancegewinn bei der Auswertung gebracht.

        Statt bei den SubString-Teilen immer auf slTemp.Strings[i] zuzugreifen ließ lieber die ganze zeile in einen privaten String und verwende dann SubString.

        Diese kleine Optimierung ist bei den meßwerten bereits berücksichtigt.

        Hast Du meine letzte mail mit den meßwerten unter Linux gelesen? Die Ergebnisse haben mich ja komplett umgehauen. Vorallem die riesigen Unterschiede zwischen einer Stringlist und meiner Methode. Auch beim Laden der Datei gab es ja bereits mehr als 50% Performancegewinn und im Vergleich zu WinNT 4.0 5 mal so schnell.

        Die Performanceunterschiede zwischen Delphi und BCB liegen wahrscheinlich daran, das ich ich noch mit Delphi 5 arbeite. In Delphi 5 mußte noch keine Rücksicht auf Kylix genommen werden, sodass jahrelang optimierter Code verwendet wird. Bei den Anpassungsarbeiten an Kylix wurde sehr viel Maschinencode aus den Units entfernt. Das sollte genauso auch den BCB betreffen. Ist aber nur eine Vermutung.

        Gruß

        Torste

        Comment


        • #34
          Hallo Torsten,

          stimmt auffallend. Die Zeit für das Auswerten läßt sich damit bei meiner Routine ebenfalls auf ca. 3,5 Sek. drücken (obwohl es doch eine Operation mehr ist, man müßte sich mal den VCL-Source ansehen).

          Beim Erzeugen ist der Ressourcenfresser das Verketten der Strings. Wenn ich den String vor der Schleife verkette, dauert das Erzeugen nur noch 90 ms (obwohl das natürlich völlig unrealistisch ist). Beim Ereugen haben wir also nicht die Performance von TStringList, sondern die von AnsiString getestet...

          Grüße Joche

          Comment


          • #35
            Hallo Jochen,
            ja die Text Datei ist ein export aus SAP.
            Die Datei wird jeden Tag neu erstellt. Ich versuche sie einzulesen, meine Datenbank "SAP DB" damit zu aktuallisieren und über eine ISAPI.dll "Intraweb" ein Telefonverzeichnis mit diversen extras (Fotos, usw.)zu erstellen.
            Schade das es in eueren Benchmark kein "Andreas-Button" gibt. Leider hat mich die Grippe erwischt es dauert noch mit der Delphi Umsetzung.
            Gruss
            Andrea

            Comment


            • #36
              Hallo Andreas,

              dann sollten die Dateien ja relativ klein bleiben, da würde ich bei TStringList und AnsiString bleiben, auch wenn es relativ langsam ist.

              Gute Besserung.

              Grüße Joche

              Comment


              • #37
                Guten Tag Andreas,

                also ich lese immen eine Zeile komplett ein, und kopiere dann alle Felder in einmezelner Variablen. Die kann kann ich dann auch noch bearbeiten. Stringfelder können in unterschiedliche Anzahl von Zeichen aufweisen, drum ist ein Trim nicht verkehrt. Je nach Ausrichtung der des Feldes kan es trimLeft oder trimRight sein.
                Ein Beispiel sagt mehr als alle Worte:

                if (OpenDialog1.Execute) then cImport := OpenDialog1.FileName;

                try
                //ShowMessage('In der Testphase werden die Artikel nur angezeigt!');
                Screen.Cursor := crHourglass;

                AssignFile(tOrgDatei, cImport);
                {$I-}
                Reset(tOrgDatei);
                {$I+}

                if IOResult <> 0 then
                begin
                Screen.Cursor := crDefault;
                ShowMessage('Fehler beim Lesen!');
                end
                else
                begin
                while not EOF(tOrgDatei) do
                begin
                iWoSemi := 0; iStrLg := 0; cZeile := ''; cNeu := '';
                cSpArtNr := ''; cArtName := ''; cAlterArtNr := ''; cArtNrOrg := '';
                cPreisAend := ''; cStueckAend := ''; cBeschrAend := ''; cNeuProduct := '';
                cProductAend := ''; cKatalog := ''; cKlasse := ''; cSector := '';
                cRabattSt := ''; cEAN := ''; cArtRange := ''; cStueckPac := '';
                cVKPreis := ''; cEKPreis := ''; cVPE := ''; cMwstCode := '';
                cArtGruppe := ''; cVKStueck := ''; cVKVPE := '';
                cPreisAend := 'N'; cZZeile := ''; cOrgNr := '';
                //-------------------------------------------------------------

                ReadLN(tOrgDatei, cZeile);

                //1 Spicersnummer
                cSpArtNr := Copy(cZeile, 1, 6);

                //2 Artikelname
                cArtName := Copy(cZeile, 25, 38);
                OEMToChar(PChar(cArtName), PChar(cArtname));
                cArtName := TrimRight(cArtName);
                cArtName := AnsiLowerCase(cArtName);

                //MWSTCode
                cMwstCode := Copy(cZeile, 65, 1);

                //7 Verkaufspreis
                cVKPreis := Copy(cZeile, 77, 6);
                cVKPreis := TrimLeft(cVKPreis);

                //8 EK-Preis
                cEKPreis := Copy(cZeile, 83, 6);
                cEKPreis := TrimLeft(cEKPreis);

                //11 Herstellerreferenz (Original Artikelnummer)
                cArtNrOrg := Copy(cZeile, 125, 20);
                cArtNrOrg := TrimRight(cArtNrOrg);
                cArtNrOrg := lowerChar(cArtNrOrg);

                //12 Preisänderungen
                cPreisAend := Copy(cZeile, 145, 1);

                //13 Stückzahländerungen
                cStueckAend := Copy(cZeile, 146, 1);

                //14 Beschreibungsänderungen
                cBeschrAend := Copy(cZeile, 147, 1);

                //15 Neues Produkt
                cNeuProduct := Copy(cZeile, 148, 1);

                //16 Producktänderung
                cProductAend := Copy(cZeile, 149, 1);

                //17 Katalog/Seite
                cKatalog := Copy(cZeile, 151, 4);
                cKatalog := TrimLeft(cKatalog);

                //19 Klasse
                cKlasse := Copy(cZeile, 171, 1);

                //20 Sector
                cSector := Copy(cZeile, 172, 4);

                //21 EAN-Code
                cEAN := Copy(cZeile, 176, 13);
                cEAN := TrimLeft(cEAN);

                //23 Stuck/Pack
                cStueckPac := Copy(cZeile, 189, 6);
                cStueckPac := TrimLeft(cStueckPac);

                //22 Verpackungseinheit
                cVPE := Copy(CZeile, 195, 6);
                cVPE := TrimRight(cVPE);

                if (cArtNrOrg = '') or (cArtNrOrg = '*****') then cArtNrOrg := cSpArtNr;
                cArtNrOrg := AnsiLowerCase(cArtNrOrg);
                //-----------------------------------------------------------

                Ich hoffe es kann Dir helfen

                Comment

                Working...
                X