(Gast)
n/a Beiträge
|
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/
|