![]() |
Seitenumbrüche in Textdatei zählen
Hallo,
wie kann ich in einer Textdatei alle Seitenumbrüche zählen? Danke im Vorraus Bea |
Re: Seitenumbrüche in Textdatei zählen
gar nicht. seiteumbruch hängt imho vom texteditor ab in dem man die textdatei anschaut. man kann aber die zeilenumbrüche zählen, weil das einfach normale zeichen sind die dem texteditor sagen dass er die nächste zeile in einer neuen zeile darstellen soll.
|
Re: Seitenumbrüche in Textdatei zählen
Hallo,
das Zählen der Zeilenumbrüche nützt mir aber nichts denk ich. Die Textdatei ist ungefähr so aufgebaut: Zeilenumbruch Zeilenumbruch Zeilenumbruch Text blabla Text blabla Text blabla Text blabla Zeilenumbruch Zeilenumbruch Zeilenumbruch SEITENUMBRUCH Zeilenumbruch Zeilenumbruch Zeilenumbruch Text blabla ... ... Ich muss genau wissen, wieviel Seitenumbrüche in der Datei enthalten sind. Im Editor z.B. sind diese Seitenumbrüche auch als sichtbar. Schaue ich mir diese Datei z.B. mit UltraEdit im Hex-Modus an, steht da ein 0C. Also dachte ich mir, ich könnte alle vorkommenden 0C zählen, weiß aber nicht , wie das geht. CU Bea |
Re: Seitenumbrüche in Textdatei zählen
Hallo,
da gibt es mehrere Möglichkeiten, die ja nach Größe der Datei performanter sind. Die einfachste Möglichkeit ist, die Datei in einen Stream zu laden und dann einfach die Zeichen durchzugehen. Sobald Du auf den Wert $0C triffst, erhöhst Du einen Zähler. Dabei solltest Du beachten, dass bei kleinen Dateien ein MemoryStream besser ist, bei großen Dateien (viele MB) ein FileStream. Gruß xaromz |
Re: Seitenumbrüche in Textdatei zählen
Hai Bea,
das einfachste dürfte sein die Datei in einen Stream zu laden und dort dann nach $0C (ASCII-Code für ein FormFeed) zu suchen. Edit: Da war einer schneller ;-) |
Re: Seitenumbrüche in Textdatei zählen
Hallo,
zuerst einmal vielen Dank für die schnellen Antworten. Ich habe da im Forum etwas gefunden und versucht für mich passend zu machen. Wäre das so richtig?
Delphi-Quellcode:
CU Bea
procedure TForm1.Button1Click(Sender: TObject);
Var FS: TFileStream; Buffer: Array of Byte; I,Z: Integer; Begin z:=0; Try {Datei öffnen} FS := TFileStream.Create('C:\OZF\vr130_ar_54871.txt', fmOpenReadWrite); {Speicher für Buffer allozieren} SetLength(Buffer,FS.Size); {Daten einlesen (8ung: Buffer>>[0]<<} FS.Read(Buffer[0],Length(Buffer)); {Bytefolge suchen} For I := 0 to Length(Buffer) - 3 do If (Buffer[I] = $0C) Then Begin Inc(Z); End; FS.Free; ShowMessage('Anzahl: '+IntToStr(Z)); Except On EFOpenError do ShowMessage('Datei konnte nicht geöffnet werden'); Else ShowMessage('Unbekannter Fehler'); End; End; [edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit] |
Re: Seitenumbrüche in Textdatei zählen
Moin Bea,
sieht, im Wesentlichen, richtig aus, nur warum die Schleife bis Length-3 geht ist mir nicht klar. Ich würde sie bis Length-1 laufen lassen. Ausserdem sollte nach dem Create noch ein try/finally-Block beginnen (Resourcenschutzblock). Warum eigentlich fmOpenReadWrite? Lesen müsste genügen. |
Re: Seitenumbrüche in Textdatei zählen
Im Prinzip richtig, aber gibt es einen Grund, warum du die letzten zwei Byte deiner Datei ignorierst?
Ansonsten gibt es halt ein paar Kleinigkeiten, nichts wildes. So brauchst du die Datei eigentlich nicht extra zum Schreiben öffnen, solltest aber das Schreiben in die Datei verbieten
Delphi-Quellcode:
Ja, dann sollte deine Textdatei nicht all zu groß sein, da du immer den ganzen Stream in den buffer kopierst, aber denke einfach mal, dass ist bei deiner Datei noch nicht entscheident.
Fs := TFileStream.Create(FileName, fmOpenRead or fmDenyWrite);
Und ansonsten solltest du den Speicher, der für Buffer alloziert wurde ruhig wieder freigeben.
Delphi-Quellcode:
Gruß Der Unwissende
finalize(buffer);
buffer := nil; |
Re: Seitenumbrüche in Textdatei zählen
Hallo,
noch eine Anmerkung: Wenn Du mit TFileStream eine Datei öffnest und dann in einen Buffer schreibst, kannst Du auch gleich einen TMemoryStream nehmen. Der macht nämlich genau das gleiche. Da gibt's dann die Eigenschaft Memory. Gruß xaromz |
Re: Seitenumbrüche in Textdatei zählen
Xaromz hat recht.
Falls du bei einem FileStream bleiben willst, würde ich das so machen: (Dürfte nur, wenn ich mir das richtig überlege recht langsam sein)
Delphi-Quellcode:
(Ich hoffe der Code funktioniert, konnte jetzt leider nicht testen :?)
var FS: TFileStream;
buf: byte; UmbruchCount: integer; begin UmbruchCount := 0; FS := nil; try // Datei zum lesen öffnen, Schreiben verbieten FS := TFileStream.Create('C:\bla.txt',fmOpenRead or fmShareDenyWrite); // Gesammten FileStream Byte-weise durchlaufen while FS.Position < FS.Size do begin FS.Read(buf,sizeof(buf)); if buf = $0C then inc(UmbruchCount); end; finally FS.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 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 by Thomas Breitkreuz