Suche und Ersetzen in Text-Datei (ASCII)

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Suche und Ersetzen in Text-Datei (ASCII)

Re: Suche und Ersetzen in Text-Datei (ASCII)

von daswaldhorn » Mi, 25.05.2011 21:29

Hallo ihr vier,

vielen Dank für eure schnellen Tips, jetzt sieht's schon besser aus. :-)
balu hat geschrieben:Tausche

Code: Alles auswählen

Arg(0).Value = "True"
gegen

Code: Alles auswählen

Arg(0).Value = True
Ohne "" ist es richtig. :-)
balu hat geschrieben: Dein Suchbegriff ist: "Hidden"
Damit müsstest Du regelrecht erschlagen werden :wink:.
Genau, in diesem Thread habe ich den Hinweis auf "Minimized" statt "Hidden" gefunden, damit klappt es.
komma4 hat geschrieben:Also, bei mir funktioniert das Öffnen mit WRITER auch bei einer *.txt-Datei, ebenso der ReplaceDescriptor.
Der Umweg über das Einlesen ist unnötig.
Klar, wenn ich schon den Export-Filter nutze kann ich auch den Import-Filter nehmen. :-) Damit ist es jetzt viel schneller, eine Datei mit 5 MB ist jetzt in 3 Sekunden durch.
Karolus hat geschrieben:Deine Dateipfade sehen so aus als ob du mit Linux arbeitest -
Dann vergiss OOo für diese Aufgabe und gib in einem Terminal folgende Befehle ein :
  • cd pfad/zum/verzeichnis
    sed -e 's|muss weg|muss hin|g' < input.txt > output.txt
Ja Linux ist bei mir richtig und für mich selbst würde ich das ja auch mit sed in einem bash-Script machen. Aber das Thema ist nur ein kleiner Teil für ein Programm für meinen Vater, der halt unter Windows arbeitet. Und den überzeuge ich so schnell nicht von Linux. :-)
DPunch hat geschrieben:

Code: Alles auswählen

Replace(meinString,"Muss weg!","Muss hin!")
Danke, das werde ich mir merken. Wie gesagt, das wird noch bissel umfangreicher, wo auch die Such- und Ersetzungswerte aus einer Tabelle kommen werden. Aber das ist ein anderes Thema und wird auch ein anderer Thread...

Zur Zusammenfassung hier der geänderte Code:

Code: Alles auswählen

Sub SuchenErsetzen
  Dim Arg(1) as new com.sun.star.beans.PropertyValue
  Dim Arg_save(3) as new com.sun.star.beans.PropertyValue
  sDatei = "file:///home/daswaldhorn/Pfad/zur/Datei.txt"
  Arg(1).Name = "Minimized"
  Arg(1).Value = True
  Arg(0).Name = "FilterName"
  Arg(0).Value = "Text"
  vDoc = StarDesktop.loadComponentFromURL(sDatei, "_blank", 0, Arg())
  oDoc = ThisComponent
  oSuche = oDoc.createReplaceDescriptor
  oSuche.setSearchString("Muss weg!")
  oSuche.SetReplaceString("Muss hin!")
  oDoc.ReplaceAll(oSuche)
  sZiel_Datei = "file:///home/daswaldhorn/Pfad/zur/Ziel_Datei.txt"
  Arg_save(0).Name = "URL"
  Arg_save(0).Value = sZiel_Datei
  Arg_save(1).Name = "FilterName"
  Arg_save(1).Value = "Text"
  Arg_save(2).Name = "FilterData"
  Arg_save(2).Value = aFilterData()
  oDoc.storeAsURL(sZiel_Datei, Arg_save())
  oDoc.close(True)
Gruß, Carsten

Re: Suche und Ersetzen in Text-Datei (ASCII)

von DPunch » Mi, 25.05.2011 20:30

Aloha

Ansonsten kannst Du Text, da Du ihn ja eh schon in eine Variable einliest, auch einfach direkt bearbeiten und zurückschreiben, je nach Größe könnte ich mir sogar vorstellen, dass das per FileAccess schneller geht als das Öffnen per Writer + Export.
Einfache Sachen kannst Du durch

Code: Alles auswählen

Replace(meinString,"Muss weg!","Muss hin!")
ersetzen, benötigst Du tatsächlich z.B. reguläre Ausdrücke, kannst Du auch dies mit der von komma4 Hier beschriebenen Methode tun.
Diesen String schreibst Du dann einfach zurück, fertig.

Wobei der Weg von Karolus der effizienteste sein dürfte ;)

Re: Suche und Ersetzen in Text-Datei (ASCII)

von Karolus » Mi, 25.05.2011 20:09

Hallo

Deine Dateipfade sehen so aus als ob du mit Linux arbeitest -
Dann vergiss OOo für diese Aufgabe und gib in einem Terminal folgende Befehle ein :
  • cd pfad/zum/verzeichnis
    sed -e 's|muss weg|muss hin|g' < input.txt > output.txt
Gruß Karo

Re: Suche und Ersetzen in Text-Datei (ASCII)

von komma4 » Mi, 25.05.2011 19:59

daswaldhorn hat geschrieben:.createReplaceDescriptor() nicht funktioniert, schreibe ich die Datei zuerst in ein Writer-Dokument,
Also, bei mir funktioniert das Öffnen mit WRITER auch bei einer *.txt-Datei, ebenso der ReplaceDescriptor.
Der Umweg über das Einlesen ist unnötig.


Zu HIDDEN hat Dir balu schon den richtigen Tipp gegeben ;)

Re: Suche und Ersetzen in Text-Datei (ASCII)

von balu » Mi, 25.05.2011 19:52

Hallo Carsten,

habs jetzt nicht getestet, aber mach mal folgendes.
Tausche

Code: Alles auswählen

Arg(0).Value = "True"
gegen

Code: Alles auswählen

Arg(0).Value = True
Dein Suchbegriff ist: "Hidden"
Damit müsstest Du regelrecht erschlagen werden :wink:.



Gruß
balu

Suche und Ersetzen in Text-Datei (ASCII)

von daswaldhorn » Mi, 25.05.2011 19:29

Hallo zusammen,

ich möchte in einer Textdatei (kein Writer-Dokument, sondern ASCII) bestimmte Textteile durch andere ersetzen. Da auf einer String-Variable ein .createReplaceDescriptor() nicht funktioniert, schreibe ich die Datei zuerst in ein Writer-Dokument, wende darauf die .createReplaceDescriptor()-Funktion und die Ersetzung an und exportiere das Ergebnis wieder als ASCII-Datei. Das funktioniert soweit auch ganz passabel. Jedoch erscheint das Hilfs-Writer-Dokument immer im Vordergrund und man sieht wie die Datei erst einmal gefüllt wird. Bei mehreren KB großen Textdateien dauert das schon mal paar Sekunden.

Wie kann ich also das Erscheinen dieses Hilfs-Dokuments unterdrücken? Ich habe schon versucht, die Option "Hidden" bei der Erzeugung des Hilfs-Dokumentes zu verwenden, aber dann funktioniert die Methode ".text" auf das ThisComponent nicht mehr (im Code unten einfach mal die Kommentare wegnehmen).

Hier ist mein Code. Zum Testen müsst Ihr natürlich den Pfad zur Textdatei auf Eurem Rechner umbiegen. Je größer die Datei ist, desto besser sieht man den Effekt, bei ca. 260 KB sind es bei mir ca. 6 Sekunden.

Code: Alles auswählen

Sub SuchenErsetzen
  Dim Arg(1) as new com.sun.star.beans.PropertyValue
  Dim Arg_save(3) as new com.sun.star.beans.PropertyValue
  oSimpleFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
  'Datei bei Euch anpassen
  oDatei = oSimpleFileAccess.OpenFileReadWrite("file:///home/daswaldhorn/Pfad/zur/Datei.txt")
  oInputStream = createUnoService("com.sun.star.io.TextInputStream")
  oInputStream.SetInputStream(oDatei.getInputStream)
  'Diese zwei Zeilen einfach mal auskommentieren
  'Arg(0).Name = "Hidden"
  'Arg(0).Value = "True"
  vDoc = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Arg())
  oDoc = ThisComponent
  oText = oDoc.text
  do while not oInputStream.isEOF
    oDateiende = oText.getEnd()
    oText.insertString(oDateiende, oInputStream.Readline(), False)
    oText.insertControlCharacter(oDateiende, 0, False)
  loop
  oInputStream.closeInput()
  oSuche = oDoc.createReplaceDescriptor
  oSuche.setSearchString("Muss weg!")
  oSuche.SetReplaceString("Muss hin!")
  oDoc.ReplaceAll(oSuche)
  'Datei bei Euch anpassen
  sZiel_Datei = "file:///home/daswaldhorn/Pfad/zur/Ziel_Datei.txt"
  Arg_save(0).Name = "URL"
  Arg_save(0).Value = sZiel_Datei
  Arg_save(1).Name = "FilterName"
  Arg_save(1).Value = "Text"
  Arg_save(2).Name = "FilterData"
  Arg_save(2).Value = aFilterData()
  oDoc.storeAsURL(sZiel_Datei, Arg_save())
  oDoc.close(True)
End Sub
Ich hoffe Ihr habt paar Tips für mich. Da ich noch blutiger Basic-Anfänger bin, bitte gnädig sein, wenn ich mögliche Lösungen hier im Forum überlesen haben sollte. :-)

Vielen Dank für's Lesen und Gruß, Carsten

Nach oben