| 

.NET C# Java Javascript Exception

5
Wie kann ich in einer Text-Datei eine bestimmte Zeichenkette suchen und ersetzen, ohne das ich die komplette Datei neu schreiben muss?

Hier mein Fall:
Ich möchte n Dateien einlesen und in ihren nach einen bestimmten Regex-Muster eine Zeichenkette suchen.
Wenn diese gefunden ist, möchte ich diese ersetzen.

Ich habe jetzt ein Programm in c# geschrieben, welche die Dateien einließt, das Muster sucht, und dann in ein anderes Verzeichnis schreibt.

Gibt es eine Möglichkeit nur die Zeichenkette direkt in der Datei zu ändern und die Datei wieder abzuspeichern, ohne sie komplett zu schreiben?
17.10.2011
Bibo1987 256 1 8
4 Antworten
2
Du hast nicht geschrieben, ob die Zeichenlänge identisch ist? Und zwar bezogen auf die benötigten Bytes. 5 Ziffern sind 5 Ziffern, aber je nach Zeichencodierung benötigst man mehrere Bytes pro Zeichen. Dann kommst Du IMHO nicht um neu schreiben rum.

Wenn Du die Bytelänge sicherstellen kannst - schau Dir mal FileStream.Seek an: http://msdn.microsoft.com/de-de/library/system.io.filestream.seek.aspx
17.10.2011
Xantiva 2,3k 2 9
@Xantiva - Nein, die Zeichenketten sind nie gleich Lang. Beispiel: 99.102938.102938
Fängt an mit 99. dann 2x6 Zeichen - Ursprung: Ist immer gleich lang.

Danach geh ich in die Datenbank, such mir eine ID raus. Die kann von 1 bis 2Milliarden Zeichen lang sein :)
Bibo1987 17.10.2011
Dann kammst Du vielleicht "den Anfang" stehen lassen, aber wie soll der Rest (die restlichen Blöcke auf der Platte) wieder "in Reihe" kommen?
Xantiva 17.10.2011
FileSteam.Seek hat mich auf jeden fall in die richtige Richtung gelenkt. Ich hab das Beispiel der MSDN jetzt stark abgewandelt und siehe da: Es funktioniert :) Ich lasse zwar immer noch eine weitere Datei schreiben, aber das ist unwichtig...
Danke für die Antwort.
PS: Ich hab mich verschrieben: Die Zeichen können natürlich nicht bis zu 2Milliarden stellen haben, sondern nur 20 :) bigint lässt grüßen
Bibo1987 17.10.2011
Wenn es nur 20 Zeichen sein können, stören Dich Leerzeichen? Dann würde ich die 99.xxx mit Leerzeichen auf 20 Zeichen bringen und dann brauchst Du tatsächlich nur noch zu ersetzen. ;)
Xantiva 18.10.2011
ja, das ist alles so case-sensitiv und leerzeichen sind das tödlichste was da passieren kann :)
aber danke für den tipp. PS: Das mit dem FileStream.Seek funktioniert super!
Bibo1987 18.10.2011
1
Vielleicht hilft dir dieser Artikel weiter:

Insert text into existing Files in C# without buffer
17.10.2011
Eiger 1,9k 2 9
0
Ich sehe kaum Möglichkeiten, das über eine neue Datei zu lösen. Nachdem Du eh schon in eine temporäre Datei schreibst, warum löscht Du dann nicht die ursprüngliche und benennst die temporäre einfach um auf den Originalnamen?
17.10.2011
muffi 1,4k 1 9
Ich glaube, sow ar das nicht gemeint. Er will direkt auf der Datei ändern... wenn ich das richtig verstanden habe...
Eiger 17.10.2011
@Eiger - Ja so ist das, denn wenn ich direkt in der Datei herumwühlen kann, dann brauch ich keine zweite Datei mehr
Bibo1987 17.10.2011
0
Hallo Bibo1987,

schau Dir mal MemoryMappedFiles an. Bin mir nicht 100% sicher, aber ich denke, MemoryMappedFiles unterstützen das Verhalten, das Du suchst.

Viel Erfolg
Florian
17.10.2011
ffordermaier 8,4k 3 9
1
Da gibt es dasselbe Problem: Wenn man was "in der Mitte" hinzufügt, muss man die darauffolgenden Daten verschieben. Guck mal hier: http://www.developer.com/net/article.php/3828586/Using-Memory-Mapped-Files-in-NET-40.htm
puls200 17.10.2011
Danke für den Link.
Wenn ich den Fragesteller richtig verstanden habe, dann ist ein Ziel, die Datei nicht in ein anderes Verzeichnis zu schreiben. Das zweite Ziel ist, die Datei in-place zu ändern und anschließend nicht komplett zu speichern. Inwiefern "nicht komplett speichern" mit MMF realisiert werden kann, weiß ich nicht (keine Ahnung wie die implementiert sind), aber in-place Ändern sollte funktionieren.
Verschieben wird man IMO kaum vermeiden können. Aber MMF bieten die Möglichkeit zur Expansion eines vorhandenen Files. Ich probier das später mal aus, wenn ich Zeit hab.
ffordermaier 17.10.2011
@puls200: In-Place ändern funktioniert wunderbar, auch eine Vergrößerung des Files funktioniert wunderbar, aber Verschieben muss ich natürlich, da hast Du vollkommen Recht. Da hat ich vorher irgendein großes Brett vor dem Kopf...Und ob ich das dann mit nem FileStream löse (so wie es der Fragesteller wohl mittlerweile gemacht hat) oder mit nem MMF - sei's drum. Auch wenn ich gefühlsmäßig den MMF eine bessere Performance zuschreiben würde...
ffordermaier 17.10.2011

Stelle deine Datei-Frage jetzt!