![]() |
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?
|
Na klar. Du musst nur lieb drum bitten :mrgreen:
Genehmigt für dieses Mal und auch in aller Zukunft 8) ...:cat:... |
Zitat:
Um folgenden Code handelt es sich:
Delphi-Quellcode:
Und nur zur Erklärung:
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; 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:
oder übersichtlicher:
"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";
Code:
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.
"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"; 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/ |
Moin Hawk,
erst mal ein kleiner Tip: TStringList enthält die Methode "LoadFromFile". |
Jup :hello: , das ist eine Idee. Daran habe ich auch noch nicht gedacht. thx
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz