Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dat-Datei in kleinere aufteilen + nach Seitenumbruch suchen (https://www.delphipraxis.net/24211-dat-datei-kleinere-aufteilen-nach-seitenumbruch-suchen.html)

Susanne 17. Jun 2004 15:26


dat-Datei in kleinere aufteilen + nach Seitenumbruch suchen
 
Wer kann mir helfen?

Ich habe eine riesig grosse test.dat-Datei, sie ist angenommen 15 MB gross. Dieses soll nun in kleinere Dateien zerlegt werden, je etwa 1 MB gross. Dabei ist darauf zu achten, dass es dort Seitenumbrüche gibt.

Also, ich möchte erst mal alles was bis zu 1 MB ist auf jeden Fall in eine neue Datei haben, ab dieser Position muss ich jetzt nach dem nächsten Seitenumbruch suchen. Bis zu diesem Seitenumbruch soll das ganze noch mit in die Datei, nach diesem Umbruch soll es in die nächste Datei. Wenn ich dann wieder etwa 1 MB habe, muss ich wieder nach einem Seitenumbruch suchen, usw bis zum Ende der Datei.

Wie mache ich das nun?

Ich danke euch schon mal für die Hilfe.
Susanne

BKempf 17. Jun 2004 15:37

Re: dat-Datei in kleinere aufteilen + nach Seitenumbruch suc
 
Die einfachste, aber nicht gerade ressourcenschonendste Moeglichkeit waere, 1048576 Bytes zu lesen und in die erste Zieldatei zu schreiben. Danach so lange je 1 Byte rueberkopieren, bis ein Seitenumbruch gefunden wurde.
Anschliessend wiederholst du das mit dem Rest der Quelldatei, bis sie komplett zerlegt wurde.

ibp 17. Jun 2004 15:40

Re: dat-Datei in kleinere aufteilen + nach Seitenumbruch suc
 
hallo und herzlich wilkommen :dp:

das thema hatten wir schon des öfteren, dateien splitten und durchsuchen, es gibt einen gute suchfunktion hier :Hier im Forum suchengrosse datei

gruß rené

ibp 17. Jun 2004 15:46

Re: dat-Datei in kleinere aufteilen + nach Seitenumbruch suc
 
... da war vor kurzem noch mal so ein thema fällt mir gerade ein....

in datei string suchen oder so

Susanne 17. Jun 2004 15:59

Re: dat-Datei in kleinere aufteilen + nach Seitenumbruch suc
 
irgendwie habe ich völlig ein Brett vor dem Kopf gerade.

Hier mal mein Funktion, er teilt meine Grosse Datei schon in kleiner auf, nur eben nicht an der richtigen Stelle. Vielleicht könnt ihr mir anhand dieses Codes ein wenig auf die Sprünge helfen, wäre echt toll.


Delphi-Quellcode:
function TForm1.DateiAufteilen(Dateiname: String; DateiSize: LongInt): Boolean;
var
   Teile: Integer;
   ats, ts: TFileStream;
   edg, s: String;
   x: Integer;
begin
   Teile:= Round(DateiSize/1000000);
   edg:= ExtractFileExt(Dateiname);
   // veränderter DateiName: ursprünglicher und _
   s:= ChangeFileExt(ExtractFileName(Dateiname),'')+ '_';
 
   ts:=TFileStream.create(Dateiname, fmopenread);
   if ts.Size > 1000000 then
      begin
         for x:=1 to Teile2 do
            begin
               ats:= TFileStream.create(DestinationDir + '\' + s + IntToStr(x)+ edg, fmcreate);
               
               //gucken, wann kommt der nächste Seitenumbruch (1)?
               
               ats.CopyFrom(ts, ts.size div Teile2);
            end;
      end;
     DeleteFile(Dateiname);
end;

Luckie 11. Aug 2004 07:23

Re: dat-Datei in kleinere aufteilen + nach Seitenumbruch suc
 
Am einfachsten geht es mit StringListen:
Delphi-Quellcode:
function SplitTextFileAtEmptyLines(Handle: THandle; const aFilename, aDir:
  string): integer;
var
  sl, sl2, sl3: TStringList;
    // sl: Ursprungsdatei, sl2: Teildateien, sl3: Dateiliste
  PN: string; // Patentnummer für Dateiname
  Loop: Integer;
  cntFile: Cardinal;
  Dir, PartFilename: string;
  s: string; // Zeile aus Ursprungsdatei
  Filenames, TextFileFilenames: string;
begin
  SetLastError(0);
  // sicherstellen, dass der Pfad ohne Backslash endet
  Dir := ExcludeTrailingBackslash(aDir);
  cntFile := 1;
  // Stringlisten erzeugen
  sl := TStringList.Create;
  sl2 := TStringList.Create;
  sl3 := TStringList.Create;
  try
    // Ursprungsdatei in die SL laden
    sl.LoadFromFile(aFilename);
    // so lange nicht die letzte Zeile erreicht ist
    for Loop := 0 to sl.Count - 1 do
    begin
      // Zeile lesen und an sl2 anhängen
      s := sl.Strings[Loop];
      OutputDebugString(PChar(s));
      sl2.Add(s);
      // wenn s leer oder Ende von Ursprungsdatei erreicht Teildatei speichern
      if (s = '') or (Loop = sl.Count - 1) then
      begin
        // Teildateiname genrieren
        PN := copy(sl2.Strings[0], 5, 13);
        PN := StringReplace(PN, ' ', '_', [rfReplaceAll]);
        PartFilename := BuildPartFilename(Dir + '\' +PN + '.txt', cntFile);
        // speichern
        sl2.SaveToFile(PartFilename);
        // sl2 wieder leeren
        sl2.Clear;
        // Nachricht mit aktuellen Dateinamen an eigenes Fenster schicken
        SendMessage(Handle, M_FILENAME, 0,
          Integer(PChar(ExtractFilename(PartFilename))));
        // Benutzer hat "Abbrechen" geklickt -> Schleife verlassen
        if bCancel <> 0 then
          break;
        // Zeile für Dateiliste mit Dateinamen erzeugen
        Filenames := Filenames + ExtractFilename(ChangeFileExt(PartFilename, ''))
          + '    ';
        if cntFile mod 3 = 0 then // zwei Dateinamen pro Zeile
        begin
          sl3.Add(Filenames);
          Filenames := '';
        end;
        // Zählvariable für Teildateinamen erhöhen
        Inc(cntFile);
      end;
    end;
    sl3.Add(Filenames);
    // Name für Dateiliste erzeugen
    TextFileFilenames := aDir + '\' + ExtractFilename(ChangeFileExt(aFilename,
      '')) + TextFileFilesnamesExt;
    sl3.SaveToFile(TextFileFilenames);
  finally
    // Aufräumen
    FreeAndNil(sl);
    FreeAndNil(sl2);
    FreeAndNil(sl3);
    // Fertig -> "Fertig"-Nachricht an eigenes Fenster schicken
    SendMessage(Handle, M_FINISH, 0, 0);
    result := GetLastError();
  end;
end;
Du musst einfach nur immer kucken wie viel du in sl2 reingeschrieben hast an Zeichen. Dabei gilt ein Zeichen ist ein Byte. Delphi-Referenz durchsuchenlenght(sl2.Text) würde dir dann die Dateigröße in Byte zurückgeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 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