Announcement

Collapse
No announcement yet.

Suchmaske über Textdatei legen.

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

  • Suchmaske über Textdatei legen.

    Hallo,

    ich versuche eine Suchmaske über eine große Textdatei (ca. 100.000 Zeilen) zu legen. Ich lade zunächst die Textdatei in einen Editor (Synedit Komponente) die Datei wird dann im Programm angezeigt. Bei der Textdatei handelt es sich um eine List- bzw. Druckdatei von einem Großrechner in der Informationen unstrukturiert dargestellt werden. Nun möchte ich in einer Art Maskendefinition bestimmte Felder definieren (anhand von Startposition und Länge und Suchbegriffen) die aus der Liste ausgelesen werden sollen. Die Maske soll dann über die Textdatei gelegt werden und alles andere herausgefiltert werden. Das Ergebnis soll dann in einer Tabelle oder Grid direkt dargestellt werden. Ziel ist es aus dieser unstrukturierten Liste die entsprechenden Datensätze herauszufiltern und dann in einem strukturierten Format abzuspeichern. Bisher habe ich die Textdatei geladen und bin durch jede Zeile "gelaufen" und habe dann die Felder herausgesucht und direkt in eine Tabelle geschrieben. Das dauert allerdings bei einer Textdatei mit 100.000 Zeilen ziemlich lange. Hat hier jemand bereits eine Lösung entwickelt oder Tipps.

    Vielen Dank und Grüße

    Hendrik

  • #2
    Hallo Hendrik,<p>
    leider schreibst Du überhaupt nicht, wie Dein bisheriges Lesen und auswerten funktioniert! Sicher würde bei ein wenig Quelltext einigen konkrete Vorschläge einfallen<p>
    Zum Lesen: Es wäre meiner Meinung nach Vorteilhaft, die Datei mit Readln einzulesen, sofern die Struktur durch Zeilenumbrüche getrennt ist. Der Einsatz von PChar statt String erlaubt an einigen Stellen, gerade beim String durchsuchen, mit Sicherheit starke Steigerungsmöglichkeiten. Leider musste ich bisher noch nie grosse Datenmengen dieser Art verarbeiten, kann darum keinen speziellen Code liefern.<p>
    Schöne Grüße, Mario Noack<p>
    weitere Ideen: http://www.entwickler-forum.de\webx?128@@.ee8a8f
    Schöne Grüße, Mario

    Comment


    • #3
      Hallo, ich lese also jede Zeile mit Readln ein und dann wird diese Zeile mit folgendem Code "geparst" um die definierten Felder herauszufiltern wobei die definierten Felder in dem Array "Felder" stehen, die Filteroptionen und Feldtypen (Datum, Zahl, Text) stehen in einer INI-Datei, in dem folgenden Code wird der entsprechende String (Startposition und Länge) ermittelt und je nach Datentyp formatiert:

      <PRE>
      //Alle Felder stehen in dem Array Felder
      for i := 0 to Felder.Count - 1 do begin
      feld_spalte:=true;
      parse_feld:='';
      if check_spalte then
      if spalte = 2 then begin
      parse_feld:='2';
      if not iniFile.readBool(felder.string [i],'check_spalte',false) then
      feld_spalte:=false;
      end;
      if not feld_spalte then
      parse_string:='';
      if check_zeile then //Prüfen ob richtige Zeile wenn check_zeile wahr
      if inifile.readinteger(felder.strings[i],'zeile',1) <> zeile then
      parse_check:=false;
      if (parse_check) AND (feld_spalte) then begin
      if inifile.readbool(felder.strings[i],'suchmaske'+parse_feld,false) then
      parse_string:=suche_string(text,inifile.readString (felder.strings[i],'suche_nach'+parse_feld,''),
      inifile.readInteger(felder.strings[i],'suche_ab'+parse_feld,0),inifile.readInteger(feld er.strings[i],'such_laenge'+parse_feld,1),inifile.readBool(feld er.strings[i],'suche_kurz'+parse_feld,true))
      else if inifile.readbool(felder.strings[i],'variable'+parse_feld,false) then
      parse_string:=get_variable
      else
      parse_string:=trim(copy(text,inifile.readinteger(f elder.strings[i],'startpos'+parse_feld,1),inifile.readinteger(feld er.strings[i],'laenge'+parse_feld,1)));
      if parse_string = '' then
      if not feld_spalte then
      parse_string:='' else
      if inifile.readbool(felder.strings[i],'leer',false) then
      if werte_alt.count > 0 then
      parse_string:=Werte_alt.strings[i];
      if inifile.readstring(felder.strings[i],'feldtyp','S') = 'D' then begin
      substr.breakstring:=inifile.readstring(felder.stri ngs[i],'tzdatum','.');
      substr.basestring:=parse_string;
      substr.BreakApart;
      try
      if substr.StringList.count >= 3 then
      parse_string:=substr.StringList.Strings[0]+'.'+substr.StringList.Strings[1]+'.'+substr.StringList.Strings[2];
      except
      // parselog('Fehler bei Datumscheck: '+parse_string,true);
      end;
      end;//Datumscheck
      if inifile.readstring(felder.strings[i],'feldtyp','S') = 'B' then begin
      if (copy(parse_string,length(parse_string),1) = '-') OR (copy(parse_string,length(parse_string),1) = 'S') then begin
      parse_string:=StringReplace(parse_string,'-','',[rfReplaceAll]);
      parse_string:=StringReplace(parse_string,'S','',[rfReplaceAll]);
      Insert('-',parse_string,1);
      end;
      parse_string:=StringReplace(parse_string,'.','',[rfReplaceAll]);
      parse_string:=StringReplace(parse_string,'H','',[rfReplaceAll]);
      // parse_string:=StringReplace(parse_string,',','.',[rfReplaceAll]);
      end;//Betragscheck
      if inifile.readstring(felder.strings[i],'feldtyp','S') = 'N' then begin
      if (copy(parse_string,length(parse_string),1) = '-') OR (copy(parse_string,length(parse_string),1) = 'S') then begin
      parse_string:=StringReplace(parse_string,'-','',[rfReplaceAll]);
      parse_string:=StringReplace(parse_string,'S','',[rfReplaceAll]);
      Insert('-',parse_string,1);
      end;
      // parse_string:=StringReplace(parse_string,',','.',[rfReplaceAll]);
      end;//Nummerncheck

      if inifile.readBool(felder.strings[i],'filter',false)then begin
      if (strtofloat(parse_string)>=inifile.readfloat(felde r.strings[i],'filtervon',0)) and (strtofloat(parse_string)<=inifile.readFloat(felde r.strings[i],'filterbis',0)) then
      //Filter OK
      else
      parse_check:=false; //Filter falsch
      end;//end check Filter

      end;//parse_check
      werte_neu.add(parse_string);
      end; //end For-Schleife
      </PRE&gt

      Comment


      • #4
        Vorschlag 1: Mit MemIniFile arbeiten. Besser: Alle wichtigen Werte vorher auslesen und in Variablen.<p>
        Vorschlag 2: Ein Copy(str,idx,1) kann durch einen Direktzugriff ersetzt werden: str[idx]<p>
        Vorschlag 3: Deine Löschen von Zeichen mit StringReplace. Evtl. gibt es eine "fertige" Routine zum Löschen einzelner Zeichen. In der JCL sollte auch was dazu sein.<p>
        Ja, und dann mal schauen, ob es schon was ausgemacht hat.<p>
        Schöne Grüße, Mario Noac
        Schöne Grüße, Mario

        Comment

        Working...
        X