![]() |
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 |
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. |
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 : ![]() gruß rené |
Re: dat-Datei in kleinere aufteilen + nach Seitenumbruch suc
|
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; |
Re: dat-Datei in kleinere aufteilen + nach Seitenumbruch suc
Am einfachsten geht es mit StringListen:
Delphi-Quellcode:
Du musst einfach nur immer kucken wie viel du in sl2 reingeschrieben hast an Zeichen. Dabei gilt ein Zeichen ist ein Byte.
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; ![]() |
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