Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verbesserungen bei Dateiverarbeitung (https://www.delphipraxis.net/4187-verbesserungen-bei-dateiverarbeitung.html)

[TP]Hawk274 18. Apr 2003 16:30


Verbesserungen bei Dateiverarbeitung
 
Ich habe mit Dateiverarbeitung noch wenig Erfahrungen. Wollte nun fragen ob man hier auch Source posten kann (welcher z.Z. funktioniert) und eventuelle Verbesserungsvorschläge bekommt?

sakura 18. Apr 2003 16:33

Na klar. Du musst nur lieb drum bitten :mrgreen:

Genehmigt für dieses Mal und auch in aller Zukunft 8)

...:cat:...

[TP]Hawk274 20. Apr 2003 00:25

Zitat:

Du musst nur lieb drum bitten
Wie knädig, aber bestimmt nur weil Ostern ist :mrgreen:

Um folgenden Code handelt es sich:
Delphi-Quellcode:
procedure TWeekDay.LoadFromFile(CurrentKW: Word);
{ Daten aus den Textdateien holen -> wird in einer Stringliste gespeichert}
var
  strFileName, s: String;
  hFile: TextFile;
  nPos, iLoop: Integer;
  slFileContent: TStringList;
  strBetreff, strOrt: String;
  dEinzelStd, dGesamtStd: Double;
begin
  //Daten lesen (vorher muss IsFileExists ausgeführt werden)
    FileMode := fmOpenRead;
    try
      strFileName := GetReportPath + GetFileName(CurrentKW);
      AssignFile(hFile, strFileName); //Datei zuweisen
      Reset(hFile); //Datei öffnen
      slFileContent := TStringList.Create; //Zeilen in StringListe speichern
      try
        repeat
          Readln(hFile, s); //Zeile lesen
          slFileContent.Insert(slFileContent.Count, s); //Daten speichern
        until EOF(hFile);
        CloseFile(hFile); //Datei schließen

//        for iLoop := 0 to slFileContent.Count-1 do
//          Showmessage(slFileContent.Strings[ iLoop ]);

        { Werte ermitteln }
        for iLoop := 0 to slFileContent.Count-1 do //jede Zeile durchgehen
        begin
          s := slFileContent.Strings[ iLoop ];
          while( s <> '' ) do
          begin
            //Betreff ermitteln
            Delete(s, 1, 1); //Hochkomma entfernen
            nPos := Pos('",', s);
            strBetreff := Copy(s, 1, nPos-1);
            Delete(s, 1, Length(strBetreff)+2);
            //Doppelte Hochkommas umwandeln
            if( Pos('""', strBetreff) > 0 ) then
              strBetreff := StringReplace(strBetreff, '""', '"', [rfReplaceAll]);
            //showmessage(strBetreff);
            //EinzelStd
            nPos := Pos(',', s);
            try
              dEinzelStd := strToFloat(Copy(s, 1, nPos));
              //Showmessage(FloatToStr(dEinzelStd));
            except
              on E:EConvertError do ErrorMsg('Einzelstunden konnte nicht gelesen werden!');
              else
              begin
                dEinzelStd := 0;
                raise
              end;
            end;
            Delete(s, 1, nPos);
            //GesamtStd
            nPos := Pos(',', s);
            try
              dGesamtStd := StrToFloat(Copy(s, 1, nPos));
              //Showmessage(FloatToStr(dGesamtStd));
            except
              on E:EConvertError do ErrorMsg('Gesamststunden konnten nicht gelesen werden!');
              else begin dGesamtStd := 0; raise end;
            end;
            Delete(s, 1, nPos+1);
            //Ort
            nPos := Pos('";', s);
            strOrt := Copy(s, 1, nPos-1);
            Delete(s, 1, Length(strOrt)+2);
            InfoMsg('Durchlauf: ' + IntToStr(iLoop) + #10 + #10 + strBetreff + #10 +
                        FloatToStr(dEinzelStd) + #10 + FloatToStr(dGesamtStd)
                        + #10 + strOrt);
          end;
        end;
      finally
        slFileContent.Free;
      end;
    except
//      on EInOutError do
//      raise;
      ErrorMsg('Error! Datei konnte nicht gelesen werden!');
    end;
end;
Und nur zur Erklärung:
Ich speichere die Daten in einer Textdatei. Die kann auch von einem Texteditor gelesen werden. Als Endung benutzte ich die für Textdateien typische .txt Endung.
Ein Datensatz sieht folgendermaßen aus:
Code:
"Test ""11",1,0,"Berlin";"Test 12",1,0,"Berlin";"Test 13",2,0,"Berlin";"Test 14",2,0,"Berlin";"Test 15",2,8,"""Berlin";
oder übersichtlicher:
Code:
"Test ""11",1.5,0,"Berlin";
"Test 12",1.75,0,"Berlin";
"Test 13",2,0,"Berlin";
"Test 14",2,0,"Berlin";
"Test 15",2,9.25,"""Berlin";
Der erste Teil besteht aus einem Text. Dieser wird in Anführungstrichel gespeichert, damit ich weiß wann dieser zu Ende ist. Schließlich kann dieser Text Leerzeichen enthalten. Somit unterdrücke ich dieses. Falls es allerdings mal vorkommen sollte, das dieser Text ebenfalls ein Anführungsstrichel enthält werde ich es beim Speichern in die Datei doppeln um beim Auslesen auf keinen Probleme zu stoßen. Als nächsten folgt eine Stundenanzahl. Stunden und Minuten werden mit Punkt getrennt. Dann folgt die GesamtStdAnzahl ebenfalls wieder in Stunden und Minuten, Delimiter ist wieder ein Punkt. Allerdings wird diese immer nur in der fünften und letzten Kette gespeichert, ansonsten ist diese immer 0. Wobei mir gerade einfällt, das man diese gar nicht speichern brauch, sondern immer errechnen kann aus den EinzelStd :D. Als letztes folgt der Ort. Dieser ist vergleichbar mit dem Text am Anfang.
Alle Werte werden immer mit Komma getrennt. Ein Datensatz enthält insgesamt immer fünf Ketten dieser Reihe. Jede Kette wird per Semikolon getrennt. Nach der fünften Kette ist Schluss und es folgt der nächste Datensatz. Insgesamt gibt es immer nur sechs Datensätze in dieser Datei.

Soviel zur Therorie. Bin gerne für Verbesserungsvorschläge und Fragen zum Problem offen.

/EDIT/
Es ist aber noch nicht realisiert, das alle Werte gespeichert werden. Zur Zeit werden diese bei jedem Durchlauf überschrieben. Wahrscheinlich werde ich die Werte in einer Array[ 0..5 ] of TStringList speichern.
/EDIT/

Christian Seehase 20. Apr 2003 11:05

Moin Hawk,

erst mal ein kleiner Tip:
TStringList enthält die Methode "LoadFromFile".

[TP]Hawk274 20. Apr 2003 12:43

Jup :hello: , das ist eine Idee. Daran habe ich auch noch nicht gedacht. thx


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