Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datei Parsen mittels RegExpr (https://www.delphipraxis.net/132823-datei-parsen-mittels-regexpr.html)

Real-TTX 20. Apr 2009 15:18


Datei Parsen mittels RegExpr
 
Hallo Gemeinde,

Ich habe ein Updateprogramm geschrieben. Das Funktioniert folgendermaßen : Dem programm wird ein HTTP Link übergeben. Ein Link von einer TXT Datei die geparst werden soll. In der Zeit ist das Programm noch nicht sichtbar. Dannach wird die Datei aufgerufen und geparst. Ich benutze folgenden Code zum parsen und bin der Meinung dass die Lösung einfach nicht sauber ist. Gibt es eine bessere Alternative?

Delphi-Quellcode:
procedure TUpdate.FileParse(strFile : string);
var
  Datei: TextFile;
  RegEx : TRegExpr;
  strZeile : string;
  intCountDownloads, intMaxDownloads : integer;
begin

  // standart werte zuweisen
  intCountDownloads := 0;
  intMaxDownloads  := 0;
  boolExitLoop     := false;

  // RegEx Objekt erzeugen und flags setzen
  RegEx            := TRegExpr.Create;
  RegEx.ModifierI  := true;

  // datei verbindung erzeugen / handle erzeugen
  AssignFile(Datei, strFile);

  // datei öffnen
  Reset(Datei);

  // downloads zählen für ProgressBarAll.Max und setzen
  while not eof(Datei) do
  begin
    ReadLn(Datei, strZeile);
    RegEx.Expression := '^\s*download\s*\".+\"\s*as\s*\".+\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
      intMaxDownloads := intMaxDownloads+1;
    end;
  end;
  ProgressBarAll.Max := intMaxDownloads;

  //  Datei erneut öffnen (Zeiger Position auf 1 setzen!?) - unsauber!
  Reset(Datei);


  // Updatedatei parsen
  while (not eof(Datei)) and (not boolExitLoop) do
  begin

    ReadLn(Datei, strZeile);

    // create directory
    RegEx.Expression := '^\s*create\s*directory\s*\"(.+)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
        WriteToLog('Script: Create Dir.: ' + RegEx.Match[1]);
        if not DirectoryExists(RegEx.Match[1]) then
        begin
          CreateDir(RegEx.Match[1]);
        end;
    end;

    // down
    RegEx.Expression := '^\s*down\s*\"(.+)\"\s*as\s*\"(.+)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
      WriteToLog('Script: Download File (Invisible)');
      try
        HTTPDownloadFile(RegEx.Match[1],RegEx.Match[2]);
      except
        ShowMessage('Error: Download File');
      end;
    end;

    // download
    RegEx.Expression := '^\s*download\s*\"(.+)\"\s*as\s*\"(.+)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
      WriteToLog('Script: Download File');
      if intMaxDownloads > 0 then
      begin
        inc(intCountDownloads);
        LabelFileNummer.Caption := IntToStr(intCountDownloads) + ' / ' + IntToStr(intMaxDownloads);
        ProgressBarAll.StepIt;
      end else begin
        LabelFileNummer.Caption := IntToStr(intCountDownloads);
      end;
      try
        HTTPDownloadFile(RegEx.Match[1],RegEx.Match[2]);
      except
        ShowMessage('Error: Download File');
      end;
    end;

    // exit
    RegEx.Expression := '^\s*exit\s*$';
    if RegEx.Exec(strZeile) then
    begin
        WriteToLog('Script: Exit');
        boolExitLoop := true;
        break;
    end;

    // open background xy
    RegEx.Expression := '^\s*set\s*background\s*\"(.+)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
        WriteToLog('Script: Set Backgroundimage: ' + RegEx.Match[1]);
        if FileExists(RegEx.Match[1]) then
        begin
          ImageHead.Picture.LoadFromFile(RegEx.Match[1]);
        end;
    end;

    // open background xy
    RegEx.Expression := '^\s*set\s*visible\s*\"(\d)\"\s*$';
    if RegEx.Exec(strZeile) then
    begin
        WriteToLog('Script: Set Form Visible: ' + RegEx.Match[1]);
        if StrToInt(RegEx.Match[1]) > 0 then
        begin
          Self.Visible := true;
        end else begin
          Self.Visible := false;
        end;
    end;

    // open background xy
    RegEx.Expression := '^\s*show\s*\"(.+)\"\s*as\s*INFO$';
    if RegEx.Exec(strZeile) then
    begin
      MessageDlg(RegEx.Match[1],mtInformation, [mbOK], 0);
    end;

  end;

  // Datei schließen
  CloseFile(Datei);

  // Falls Exit beim Parsen aufgerufen worden ist...
  if boolExitLoop then
  begin
    Self.CleanUpInstance; // Löscht Temp. Dateien etc
    Application.Terminate;
  end;

end;

Zu Parsen ist folgende Datei :
Code:
#!update:script  <-------- Dies soll später als Identifikationszeile dienen

// lädt Hintergrundbild herunter (ohne Counter)
down "http://xxxxxxxxxxxxxxxxxxxxxxx/media_repository/files/mediakit/thumb_internetcafe_6x3.jpg" as "background.jpg"

// zeigt die form an
set visible    "1"

// setzt Hintergrund
set background    "background.jpg"

// erstellt falls es noch nicht existiert ein Verzeichnis
create directory "./Download"

// Lädt Dateien herunter
download "http://real-ttx.xxxxxxxx.de/dir1/dir2/dir3/dir4/dir5/PHP.rar" as "./Download/PHP_TEST.rar"
download "http://www.real-ttx.de/xxxx.rar"             as "./Download/xxxx.rar"
download "http://www.real-ttx.de/yyyy.rar"           as "./Download/yyyy.rar.rar"

// versteckt form
set visible   "0"

// Zeigt eine Msg Dialog an (als Infobox=Ausrufezeichen)
show "Das Update wurde erfolgreich heruntergeladen" as info

// Beendet den Updater (am Client)
exit
Danke euch :)

Real-TTX 20. Apr 2009 15:19

Re: Datei Parsen mittels RegExpr
 
Noch eine kleine Frage : Was hat es sich mit der 80 Zeichen Marke die man nicht überschreiten soll auf sich?
Soweit ich weiß sind das die 80 Zeichen eines Terminals ? Aber warum das in der IDE nicht ? Bei einer Ausgabe in das Terminal verstehe ich das, aber so?

Gruß, Real-TTX

Prototypjack 20. Apr 2009 17:00

Re: Datei Parsen mittels RegExpr
 
Zitat:

Zitat von Real-TTX
Noch eine kleine Frage : Was hat es sich mit der 80 Zeichen Marke die man nicht überschreiten soll auf sich?
Soweit ich weiß sind das die 80 Zeichen eines Terminals ? Aber warum das in der IDE nicht ? Bei einer Ausgabe in das Terminal verstehe ich das, aber so?

Gruß, Real-TTX

Ich dachte immer, das sei aufgrund des Druckbildes (schlagt mich nicht, wenn's falsch ist :stupid: ).

Grüße,
Max


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 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