AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datei Parsen mittels RegExpr

Ein Thema von Real-TTX · begonnen am 20. Apr 2009 · letzter Beitrag vom 20. Apr 2009
Antwort Antwort
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#1

Datei Parsen mittels RegExpr

  Alt 20. Apr 2009, 16:18
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
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Datei Parsen mittels RegExpr

  Alt 20. Apr 2009, 16:19
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
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Datei Parsen mittels RegExpr

  Alt 20. Apr 2009, 18:00
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 ).

Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  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 14:24 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