Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Text Datei teilen (https://www.delphipraxis.net/87069-text-datei-teilen.html)

Crazymodder 22. Feb 2007 21:21


Text Datei teilen
 
Hi alle zusammen hab wieder nen Problem!
Ich hab ne Große Txt Datei und möchte dieser gerne in kleiner 1 mb Teile teilen. Also schnell rann gesetzt und nen Programm gecodet aber leider komm ich am entscheidenden Punkt nicht weiter deshlab bräuchte ich eure Hilfe.
Also die Text datei wird in eine Memo geladen. So jetzt gibst denk mal zwei Möglichkeiten entweder man lässt ihn immer nach 5000 zeilen in ein neues Text dokument speichern oder vllt kann man ihm irgendwie sagen wenn 1.txt = 1 mb groß dann mache neue datei mit dem namen 2.txt = 1mb immer so weiter obwohl mir variante 1 auch reichen würde immer nach 5000 zeilen ich weiß nur nicht wie man das schreibt.
ER müsste theroretisch immer 5000zeilen in eine weitere Memo adden und dann speichern und memo clearen.
Und dann bei der riesen txt datei aus memo1 bei zeile 5001 bist 10000 wieder nehmen und wieder in die andere adden und speichern!

Ich hoffe ihr könnt mir bei diesem problem behilflich sein
Danke im Vorraus
Crazymodder

mkinzler 22. Feb 2007 21:26

Re: Text Datei teilen
 
Öffne die Datei in einem Stream, in einem 2. Stream kannst du dann die gwünschte Anzahl von Daten Speichern-

Christian18 22. Feb 2007 21:29

Re: Text Datei teilen
 
Hallo,

ich würde es zwar bevorzugen zu Prüfen, ab 1 MB erreicht ist, aber wenn dir die andere Variate reicht, dann mach es so.

Ich würde ein Schleife in einer anderen schachteln

z.b.

Delphi-Quellcode:
for i:=1 to AnzahlderFiles do // AnzahlderFiles kannst du vorher gerechnen AnzahlderFiles=AnzahlderZeilen / 5000
  begin
    for j:=1 to 5000 do
      begin
        // Hier einfach in die neue txt schreiben
      end;
  end;
Ich hoffe ich kommte dir ein bisschen helfen.

MFG Christian18

Jürgen Thomas 23. Feb 2007 10:39

Re: Text Datei teilen
 
Wenn Du die Daten jeweils nach einem Zeilenende trennen willst, genügt TStream wohl nicht. (Bei einem Stream sparst Du Dir das Einlesen der gesamten Quelldatei). Dann nimm aber statt TMemo lieber TStringList; da entfällt die visuelle Verbindung (die kostet vor allem bei großen Dateien Speicher und Zeit). Mein Konzept:
Code:
var Quelle, Ziel: TStringList;
Summe := 0;
Start := 0;
for (alle Zeilen der Quelle)
  addiere die Länge der aktuellen Zeile zur Summe
  kopiere die aktuelle Zeile nach Ziel
  wenn Summe >= 1 MB
    Ziel.SaveToFile
    Ziel.Clear
    Summe := 0
  end
finally
  Ziel.Clear
Kannst Du damit etwas anfangen? Jürgen

Crazymodder 23. Feb 2007 14:33

Re: Text Datei teilen
 
Mh naja so ganz noch nicht.
Mh also die txt Datei ist ca 100mb groß. Mh aber so ganz versteh ich nicht wie das geht!
Könntest du das vllt mal konkret schreiben wäre dir sehr dankbar.
Also nur diesen Teil das reicht den rest bekomme ich auch hin.
Danek im Vorraus

Jürgen Thomas 23. Feb 2007 15:14

Re: Text Datei teilen
 
Für welchen der drei Vorschläge brauchst Du denn genauere Informationen? Jürgen

Crazymodder 23. Feb 2007 15:28

Re: Text Datei teilen
 
Mg joa zu deiner Idee!
var Quelle, Ziel: TStringList;
Summe := 0;
Start := 0;
for (alle Zeilen der Quelle)
addiere die Länge der aktuellen Zeile zur Summe
kopiere die aktuelle Zeile nach Ziel

Da wie macht man das halt mit der Summe! Oder bei der for Schleife. Also wäre sehr nett wenn ich dazu noch einige Info's bekommen könnte.
Ich hoffe das das nicht zu viel arbeit macht. Danke im Vorraus
Crazymodder

Jürgen Thomas 23. Feb 2007 16:23

Re: Text Datei teilen
 
Also gut; die Prozedur kann in das Formular, ein Datenmodul oder "sonstwo" eingebunden werden.
Delphi-Quellcode:
//  sQuelldatei ist der vollständige Dateiname
//  sZieldatei ist als Format-String gedacht: "E:\Temp\Geteilt_%3.d.Txt",
//  dort wird der Zähler der Teildateien eingefügt
//  iMaximum ist die maximale Anzahl von Zeichen pro Teildatei
procedure DateiTeilen(const sQuellDatei: string; const sZielDatei: string; const iMaximum: int);
var aQuelle, aZiel: TStringList;
    iSumme, iStart, iZaehler, x0: int;
begin
  //  Initialisierungen
  iSumme := 0;
  iStart := 0;
  iZaehler := 0;
  aQuelle := TStringList.Create;
  aZiel := TStringList.Create;
  try
    //  Quelle einlesen
    aQuelle.LoadFromFile(sQuellDatei);
    //  bearbeite alle Zeilen
    for x0:= 0 to aQuelle.Count - 1 do
    begin
      Inc(iSumme, aQuelle[x0]+2);
      //  wenn diese Summe schon zuviel ist, dann neue Teildatei erzeugen
      if iSumme > iMaximum
      then begin
        Inc(iZaehler);
        aZiel.SaveToFile( Format(sZielDatei, [iZaehler]) );
        //  Daten zurücksetzen
        aZiel.Clear;
        iSumme := aQuelle[x0] + 2;
      end;
      //  aktuelle Zeile kopieren
      aZiel.Add(aQuelle[x0]);
    end;
    //  letzte Teildatei speichern
    Inc(iZaehler);
    aZiel.SaveToFile( Format(sZielDatei, [iZaehler]) );
  finally
    aQuelle.Free;
    aZiel.Free;
    if iZaehler > 0
    then ShowMessage( Format("%d Teildateien erzeugt", iZaehler) );
  end;
end;
Bei der Summe habe ich immer 2 Zeichen addiert wegen CR/LF.

Was Dir jetzt noch fehlt, bitte selbst überlegen und unter Delphi-Referenz durchsuchenDelphi heraussuchen. Nicht getestet und ohne Gewähr - siehe Signatur.

Gruß Jürgen

Crazymodder 23. Feb 2007 17:32

Re: Text Datei teilen
 
Danke Danek sehr nett das ist perfekt danek so versteh ichs danke nochmal i love it thx


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