Textzeile mitten in die Datei schreiben, ohne den Text zu ersetzen

Andron

Erfahrenes Mitglied
Hallo,
meine Frage ist: wie kann ich bestehende Text-Dateien um eine Zeile erweitern?
Das Problem ist, dass die Zeile nicht an das Ende der Datei angehängt werden soll, sondern irgendwo in der Mitte. dabei dürfen die Textteile nicht überschrieben werden.
Geht das überhaupt?
Die Lösung, bei der ich die Textteile rumkopieren muss, passt leider nicht, da es manchmal bis zu 1mio Zeilen sein können.
Ich suche nach einer Lösung, bei der ich in einer Schleife schnell paar Zeilen in die Datei schreiben kann.
Hoffe, ihr könnt mir helfen.
Danke im Voraus.
 
Wenn es immer unterschiedliche Anzahl an Zeilen sein soll, musst du ja auch wissen wo das eingetragen werden soll... also, wie sieht die Struktur aus? Gibt es ein Signalwort oder ähnliches? Wenn, dann könntest du da vll was mit Stringbuffer, Regex oder Ähnlichem machen
 
Hallo,

du wirst die Datei ab dem Punkt wo du die Werte neu einfügst, neu schreiben müssen. Also alles neu reinschreiben müssen.

MFG

zEriX
 
Zu Fragestellung im Allgemeinen:

In einer Applikation werden viele, sehr viele Log-Files rausgeschrieben, dabei werden DEBUG, FATAL, ERROR und WARN-Informationen in jeweils eigene Datei geschrieben.

Nun, wenn etwas schief läuft, ist es sehr schwer den genaueren Ablauf des Programms nachzuvollziehen.
Ich muss einen Parser schreiben, der die Zeilen nach dem Datum parst und diese sortiert in die Datei schreibt.
Es sind über 1 mio Zeilen und über 20 Files. Ich habe 4 verschachtelte Schleifen. Der ganze Sortiervorgang würde über 2 Tage dauern.
Ich versuche jetzt nicht nur die früheste Zeile zu ermitteln, sondern noch die späteste, somit müsste es viel schneller gehen. Meine End-Datei wächst praktisch vom Anfang und aus der Mitte.
 
Hallo,

du wirst die Datei ab dem Punkt wo du die Werte neu einfügst, neu schreiben müssen. Also alles neu reinschreiben müssen.

MFG

zEriX



Das geht leider nicht. Mir ist die Schnelligkeit sehr wichtig.
Gibt es wirklich keine Möglichkeiten?

Ich überlege gerade:
ich schreibe an einem Punkt in der Datei "\n",
dann an derselben Position meine Zeile.
Sollte doch funktionieren, oder?
 
Du darfst das nicht so sehen wie im Texteditor. Wenn du an eine Stelle was schreibst, dann wird das was vorher da war ersetzt und nicht weitergeschoben.
Also wird es nicht so funktioniere.

Dann wirst du dir, meiner Meinung nach zumindest, was einfallen lassen müssen, die Datei von Anfang bis zum Ende zu schreiben.


Da fällt mir aber ein. Log-Dateien sind doch nach Datum sortiert.

MFG

zEriX
 
Du darfst das nicht so sehen wie im Texteditor. Wenn du an eine Stelle was schreibst, dann wird das was vorher da war ersetzt und nicht weitergeschoben.
Also wird es nicht so funktioniere.

Dann wirst du dir, meiner Meinung nach zumindest, was einfallen lassen müssen, die Datei von Anfang bis zum Ende zu schreiben.


Da fällt mir aber ein. Log-Dateien sind doch nach Datum sortiert.

MFG

zEriX


.Log-Dateien sind nicht nach dem datum sortiert, und wenn, dann nur innerhalb einer Datei. Ich habe mehrere, je eine für WARN, DEBUG, FATAL und ERROR. Ich muss die alle in eine überführen. Außerdem habe ich fast 20 Warn's, 3 Errors's und 2 Fatal's. Die DEBUG-Dateien wollen wir jetzt nicht parsen, weil die alle (über 20 Stück) je 64k Zeilen enthalten. Damit würde das Ganze fast 2 Wochen dauern.
 
Also alle Logger die ich kenne, schreiben jedes Ereignis nacheinander. Damit ist alles sortiert. Ich meine ja auch in einer Datei.

Damit hast du dann doch gar kein Problem. Du kannst doch jede Datei öffnen und immer von der Datei lesen die du brauchst.

Ich versuche mal an einem Beispiel zu erklären wie du es machen könntest.

Du hast 3 Dateien. Von allen 3 Dateien liest du einen Log-Eintrag aus. Du schaust welcher der frühere ist und schreibst diesen in die Zieldatei. Angenommen der von Datei 1 war der frühere. Dann wird der in die Datei geschrieben. Dann liest du wieder einen Log-Eintrag aus Datei 1. Dann wird wieder geschaut welcher ist der frühere. So geht das dann weiter bis alle Dateien am Ende sind.

So baust du die Datei von Anfang an auf. Ich kann mir nicht vorstellen, dass das so langsam sein soll. Also so langsam dass es mehrere Tage braucht.

MFG

zEriX
 
Also alle Logger die ich kenne, schreiben jedes Ereignis nacheinander. Damit ist alles sortiert. Ich meine ja auch in einer Datei.

Damit hast du dann doch gar kein Problem. Du kannst doch jede Datei öffnen und immer von der Datei lesen die du brauchst.

Ich versuche mal an einem Beispiel zu erklären wie du es machen könntest.

Du hast 3 Dateien. Von allen 3 Dateien liest du einen Log-Eintrag aus. Du schaust welcher der frühere ist und schreibst diesen in die Zieldatei. Angenommen der von Datei 1 war der frühere. Dann wird der in die Datei geschrieben. Dann liest du wieder einen Log-Eintrag aus Datei 1. Dann wird wieder geschaut welcher ist der frühere. So geht das dann weiter bis alle Dateien am Ende sind.

So baust du die Datei von Anfang an auf. Ich kann mir nicht vorstellen, dass das so langsam sein soll. Also so langsam dass es mehrere Tage braucht.

MFG

zEriX



Genau so mache ich.
Eine Zeile wird mit allen Zeilen einer Datei in ca. 1sek vergliechen.
Ich habe über 1 mio Zeilen.
Das sind schon mal über 200 Stunden ;).

Im Moment mache ich das so, dass die weggeschriebene Zeile aus der Quelldatei gelöscht wird. Klappt alles wunderbar. Speicherverbrauch liegt bei etwa 8MB, CPU ist zu 90% ausgelastet, alles läuft.
Mir ist auch klar, dass es zu Ende schneller gehen wird. Es wird aber erwartet, dass das Programm innnerhalb von max. 1-3 Stunden alles erledigt.
 
Zurück