AGB  ·  Datenschutz  ·  Impressum  







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

Verbesserungen bei Dateiverarbeitung

Ein Thema von [TP]Hawk274 · begonnen am 18. Apr 2003 · letzter Beitrag vom 20. Apr 2003
Antwort Antwort
[TP]Hawk274
(Gast)

n/a Beiträge
 
#1

Verbesserungen bei Dateiverarbeitung

  Alt 18. Apr 2003, 17:30
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?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2
  Alt 18. Apr 2003, 17:33
Na klar. Du musst nur lieb drum bitten

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

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
[TP]Hawk274
(Gast)

n/a Beiträge
 
#3
  Alt 20. Apr 2003, 01:25
Zitat:
Du musst nur lieb drum bitten
Wie knädig, aber bestimmt nur weil Ostern ist

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 . 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/
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 20. Apr 2003, 12:05
Moin Hawk,

erst mal ein kleiner Tip:
TStringList enthält die Methode "LoadFromFile".
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
[TP]Hawk274
(Gast)

n/a Beiträge
 
#5
  Alt 20. Apr 2003, 13:43
Jup , das ist eine Idee. Daran habe ich auch noch nicht gedacht. thx
  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 06:35 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