![]() |
Re: Überprüfen ob alle Zeilen vorhanden sind
Zitat:
Was willst Du denn eigentlich erreichen. Muss wirklich für jede Sekunde ein Eintrag stehen, auch wenn Du keinen Text hintendran schreibst. |
Re: Überprüfen ob alle Zeilen vorhanden sind
hallo Jelly
Zitat:
Zitat:
Zitat:
ich bekomm das nicht in marabus's beispiel integriert:
Delphi-Quellcode:
DT := StrToDateTime(Copy(Line, 1, 19));
// Uhrzeit in Sekunden umrechen NewSeconds := Round(86400 * Frac(DT)); // bei der ersten Zeile erfolgt keine Prüfung if (LastSeconds >= 0) then for i := LastSeconds + 1 to NewSeconds - 1 do ShowMessage (Format('Zeile %d fehlt', [i])); gruss, capo |
Re: Überprüfen ob alle Zeilen vorhanden sind
Hallo capo,
es ist ohne weiteres möglich, meinen und marabus Code zusammenzuführen. Die Routine DoLine erhält alle gültigen Zeilen der Eingabedatei. Hier kann also die Überprüfung auf fehlende Zeilen vorgenommen werden. Die notwendige Variable LastSeconds aus meinem Code bringst du am besten im private-Abschnitt des Formulars unter, die Initialisierung der Variablen in der Methode FormCreate. Zwei kleine Änderungen würde ich an marabus Code noch vornehmen. Das fehlende "else" hast du wahrscheinlich schon entdeckt, die Umschaltung der Variablen index sollte meiner Meinung nach nur nach einer gültigen Zeile vorgenommen werden. Ansonsten erscheinen mehrfache doppelte Zeilen, die durch Leerzeilen unterbrochen werden, mehrfach im Ausgabeprotokoll.
Delphi-Quellcode:
Gruß Hawkeye
type
TDemoForm = class (TForm) : private LastSeconds : Integer; end; procedure TDemoForm.FormCreate(Sender: TObject); begin LastSeconds := -1; end; procedure TDemoForm.CheckForMissingLines (line: String); var DT : TDateTime; NewSeconds : Integer; i : Integer; begin DT := StrToTime(Copy(line, 1, 8)); NewSeconds := Round(86400 * DT); if (LastSeconds >= 0) then for i := LastSeconds + 1 to NewSeconds - 1 do LogMemo.Lines.Add(Format('Eintrag für Uhrzeit %s fehlt', [TimeToStr(i / 86400)])); LastSeconds := NewSeconds; end; procedure TDemoForm.DoLine(lineCount: Integer; line: String); begin CheckForMissingLines (line); KeepMemo.Lines.Add(line); end; procedure TDemoForm.DoEmptyLine(lineCount: Integer); begin LogMemo.Lines.Add(Format('Zeile %d ist leer', [lineCount])); end; procedure TDemoForm.DoSameLine(lineCount: Integer; line: String); begin LogMemo.Lines.Add(Format('Zeile %d ist doppelt: %s', [lineCount, line])); end; procedure TDemoForm.CheckText(fn: TFileName); var tf: TextFile; index, lineCount: Integer; lines: array [0..1] of String; begin lines[0] := ''; lines[1] := ''; lineCount := 0; index := 0; KeepMemo.Clear; LogMemo.Clear; AssignFile(tf, fn); Reset(tf); while not Eof(tf) do begin Inc(lineCount); ReadLn(tf, lines[index]); // Test auf Leere if lines[index] = '' then DoEmptyLine(lineCount) else // Test auf Gleichheit if Copy(lines[0], 1, 8) = Copy(lines[1], 1, 8) then DoSameLine(lineCount, lines[index]) // Sonst else // <<-- dieses else fehlte begin DoLine(lineCount, lines[index]); index := 1 - index; // <<-- Umschaltung nur nach gültigen Zeilen end; end; CloseFile(tf); end; |
Re: Überprüfen ob alle Zeilen vorhanden sind
hallo
dankeschön für die wahnsinns hilfe. ich trau mich schon fast nicht mehr zu fragen. CheckForMissingLines (line); funktioniert irgendwie nicht. Es werden keine fehlenden Zeiten angezeigt. ich kann nirgends einen fehler sehen. capo |
Re: Überprüfen ob alle Zeilen vorhanden sind
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Capo,
der von Hawkeye angepasste Code tut es einwandfrei. Wie sehen deine Daten aus? Grüße vom marabu |
Re: Überprüfen ob alle Zeilen vorhanden sind
hi marabu
stimmt dein beispiel funktioniert. eine zeile sieht von der struktur so aus Zitat:
|
Re: Überprüfen ob alle Zeilen vorhanden sind
Wir gingen bisher davon aus, dass die Uhrzeit am Anfang der Zeile steht. Damit deine Beispielzeilen korrekt verarbeitet werden, müsstest du in der Prozedur CheckForMissingLines() folgende Zeile ändern:
Delphi-Quellcode:
Die Funktion Between() könnte so aussehen:
// DT := StrToTime(Copy(line, 1, 8));
DT := Between(line, ' ', ' ');
Delphi-Quellcode:
Auch die Funktion PosEx() findest du hier im Forum, falls du sie nicht in der Unit StrUtils hast. Du solltest vielleicht deine Delphi-Version in dein DP-Profil eintragen.
function Between(const s, sLeft, sRight: String): String;
var iLeft, iRight: Integer; begin iLeft := Pos(sLeft, s); if iLeft > 0 then begin Inc(iLeft, Length(sLeft)); iRight := PosEx(sRight, s, iLeft); if iRight > 0 then Result := Copy(s, iLeft, iRight - iLeft) else Result := '' end else Result := ''; end; Ganz allgemein gilt, dass du ein Muster in deinen Daten erkennen und den Code zur Extraktion der Zeitangaben entsprechend anpassen musst. Und vergiss nicht, dass es Probleme beim Tagwechsel geben wird, wenn du keine Vorkehrungen triffst. marabu |
Re: Überprüfen ob alle Zeilen vorhanden sind
weißt du was ich nicht verstehe.
wieso kopiert
Delphi-Quellcode:
nicht die uhrzeit heraus egal was davor oder dahinter steht?
DT := StrToTime(Copy(line, 5, 12));
in dem beispiel für horst steht ja auch noch etwas davor. so sieht der text aus Zitat:
Delphi-Quellcode:
mensch ist das schwer.
---------------------------
Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Demo.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung: ''10:00:08 tes' ist keine gültige Uhrzeit'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- capo |
Re: Überprüfen ob alle Zeilen vorhanden sind
Die zwölf als zweites Argument im Aufruf von Copy() ist etwas reichlich bemessen - Copy(line, 5, 8) würde reichen und wahrscheinlich auch ein besseres Ergebnis liefern. Schau doch mal in die Online-Hilfe ...
marabu |
Re: Überprüfen ob alle Zeilen vorhanden sind
okay das klappt nun *puhh*
danke capo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 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