AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Textdatei bei 100 MB Truncaten

Ein Thema von af99 · begonnen am 16. Jul 2015 · letzter Beitrag vom 18. Jul 2015
Antwort Antwort
Seite 2 von 2     12
af99

Registriert seit: 22. Apr 2004
84 Beiträge
 
Delphi XE5 Ultimate
 
#11

AW: Textdatei bei 100 MB Truncaten

  Alt 17. Jul 2015, 10:57
ich hab nochmal nachgeschaut

FileStream.Size gibt die Größe in Bytes an
SizeOf() gibt auch die Größe in Bytes an

Wenn ich also das mache
FileStream.Size := 999900 + SizeOf(copy(buffer, 1, pos(char(13) , buffer)))
dann sollte ich doch am Ende der Zeile landen.

Ist aber leider nicht so?!
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#12

AW: Textdatei bei 100 MB Truncaten

  Alt 17. Jul 2015, 11:12
mit pos findest Du immer das erste Auftreten eines Strings/Zeichen. Du willst aber das letzte.
wie wäre es mit so etwas z.B.

Delphi-Quellcode:
i:=length(buffer);
repeat
  dec(i,1);
until (i<0) or buffer[i]=$0D;
if buffer[i]=$0D then.......
Gruß
K-H

P.S.
Mit anderen worten stand das schon in #3
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (17. Jul 2015 um 11:14 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Textdatei bei 100 MB Truncaten

  Alt 17. Jul 2015, 11:38
Euch ist aber auch klar dass man vorne auch nur einfach so abschneiden kann wenn die Datei kein Byte Order Mark hat, oder?

Das würde ich mir wenigstens am Anfang noch auslesen, dann ausrechnen, wie viel wir wegwerfen wollen, im Stream soweit (minus die Größe des BOM) vorwärts wandern, BOM wieder schreiben und zumachen.
  Mit Zitat antworten Zitat
af99

Registriert seit: 22. Apr 2004
84 Beiträge
 
Delphi XE5 Ultimate
 
#14

AW: Textdatei bei 100 MB Truncaten

  Alt 17. Jul 2015, 12:00
hmmm, ja ok. Damit bekomme ich die Position der CRLF. Ich denke die hatte ich vorher auch schon. Wie bekomme ich aber nun die Länge in Bytes des Buffers von Anfang bis zu CRLF?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#15

AW: Textdatei bei 100 MB Truncaten

  Alt 17. Jul 2015, 12:59
Euch ist aber auch klar dass man vorne auch nur einfach so abschneiden kann wenn die Datei kein Byte Order Mark hat, oder?

Das würde ich mir wenigstens am Anfang noch auslesen, dann ausrechnen, wie viel wir wegwerfen wollen, im Stream soweit (minus die Größe des BOM) vorwärts wandern, BOM wieder schreiben und zumachen.
Hab ich da was verpasst? Warum willst Du vorne was abschneiden?
So wie ich es verstanden habe soll eine Textdatei (Zeilenende=#13#10) nach 100 MB (oder 99,5674593 MB) abgeschnitten werden.

Dafür würde ich mehrere Buffer zu je xxByte lesen und schreiben und im letzten vor Erreichen der 100MB Grenze suche ich das letzte #13#10 (oder wie auch immer das Zeilenende aussieht) und schreibe den Bufferinhalt bis zu dieser Position weg.
(hoffentlich ist der Buffer so groß, daß auch die längsten Zeilen da hinein passen!)

Da ist mir doch vollkommen egal was für eine Kodierung/Zeichensatz die Datei hat. Konkret muß ich nur die Kodierung von "Zeilenende" kennen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Textdatei bei 100 MB Truncaten

  Alt 17. Jul 2015, 13:03
[QUOTE=p80286;1309014]So wie ich es verstanden habe soll eine Textdatei (Zeilenende=#13#10) nach 100 MB (oder 99,5674593 MB) abgeschnitten werden.[/URL]

Ok, dann halt so. Da ich "log.txt"-Datei gelesen hatte dachte ich man schneidet dort ältere Nachrichten ab statt neuere.
  Mit Zitat antworten Zitat
af99

Registriert seit: 22. Apr 2004
84 Beiträge
 
Delphi XE5 Ultimate
 
#17

AW: Textdatei bei 100 MB Truncaten

  Alt 17. Jul 2015, 13:38
ups, da hast Du vollkommen Recht. Ich muss also oben abschneiden.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#18

AW: Textdatei bei 100 MB Truncaten

  Alt 17. Jul 2015, 13:40
@Schönster aller Günther
Hast Du eine neue Kristalkugel oder kannst Du Gedanken lesen?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.752 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Textdatei bei 100 MB Truncaten

  Alt 17. Jul 2015, 13:46
.. wenn neue log Einträge via add hinzugefügt werdem werden diese am Ende der Datei angehängt und die lätesten Enträge sind am Anfang der Datei.

Werden neue log Einträge via insert immer am Anfang der Datei eingefügt sind die ältesten Einträge am Ender der Datei.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.123 Beiträge
 
Delphi 10.3 Rio
 
#20

AW: Textdatei bei 100 MB Truncaten

  Alt 18. Jul 2015, 18:51
Werden neue log Einträge via insert immer am Anfang der Datei eingefügt sind die ältesten Einträge am Ender der Datei.
Wie machst Du den einen Insert auf eine Datei?

Auf die schnelle ungetestet:

100.000 Bytes Truncate

Delphi-Quellcode:
procedure Truncate100;
var
  FS : TFileStream;
  Buffer : TDynByteArray;
  I : Integer;
begin
  FS := TFileStream.Create('log.txt',fmOpenread);
  try
    if FS.Size > 100000 then
      begin
        FS.Seek(100000,soEnd);
        Setlength(Buffer,100000);
        FS.ReadBuffer(Buffer[0],100000);
        FS.Free;
        i := 0;
        While i < 99999 do
          begin
            if (Buffer[i] = 13) and Buffer[i+1] = 10 then
              begin
                inc(I,2);
                break;
              end;

            inc(i);
          end;

        FS := TFileStream.Create('log.txt',fmOpenWrite);
        try
          FS.WriteBuffer(Buffer[i],100000-i);
        finally
          FS.Free;
        end;
      end;
  finally
    FS.Free;
  end;
end;

Geändert von Mavarik (18. Jul 2015 um 19:04 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:36 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