Suche und Ersetzen in Text-Datei (ASCII)

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Benutzeravatar
daswaldhorn
****
Beiträge: 196
Registriert: Mo, 17.05.2004 22:29
Wohnort: Voerde
Kontaktdaten:

Suche und Ersetzen in Text-Datei (ASCII)

Beitrag von daswaldhorn »

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
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

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

Beitrag von balu »

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
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

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

Beitrag von komma4 »

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 ;)
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

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

Beitrag von Karolus »

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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

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

Beitrag von DPunch »

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 ;)
Benutzeravatar
daswaldhorn
****
Beiträge: 196
Registriert: Mo, 17.05.2004 22:29
Wohnort: Voerde
Kontaktdaten:

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

Beitrag von daswaldhorn »

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
Antworten