BITTE helfen Sie uns HEUTE mit einer SPENDE
Das LibreOffice Forum braucht jetzt Ihre Hilfe!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Mehrere Zeichen per Makro ersetzen

Alles zur Programmierung im LibreOffice.
Antworten
Mau
! Supporter - Spende !
Beiträge: 438
Registriert: Do 14. Feb 2013, 19:37

Mehrere Zeichen per Makro ersetzen

Beitrag von Mau » So 1. Jul 2018, 23:50

Liebe ExpertInnen,

ich habe etliche noch unter WordPerfect erstellte türkischsprachige Altdateien im Codierungsformat Westeuropa (Windows-1252/WinLatin 1), die ich in ODT-Dateien umwandeln möchte. Eine dieser Altdateien hänge ich an. Jetzt habe ich, da ich die Syntax von OOo nur in kleinen Ausschnitten und auch nur so leidlich beherrsche, mit dem Dispatcher einen Makro erstellt und den so überarbeitet, dass er wenigstens schon mal die drei am häufigsten vorkommenden Zeichen automatisch austauschen kann. Aber das mit einem entsprechend dilettantisch programmierten Code - ohne Ausstiegs- bzw. Fehler-Routinen, ohne Schleifen bzw. Subroutines mit Variablenübergabe usw. usf. Im Anhang ist der Durchgang für das erste zu ersetzende Zeichen komplett wiedergegeben, dann folgt der Anfang des Durchgangs für das zweite Zeichen; der ganze Makro enthält aber drei Durchgänge.
Vielleicht hat eine(r) von euch die Zeit, daraus einen ordentlichen OOo-Code zu basteln?
Ich denke, wenn ich den erst einmal habe, kann ich ihn auch ohne Hilfe für die sonstigen auszutauschenden Zeichen erweitern.

Gruß,
Mau
Dateianhänge
Dünya Ekonomisi 20030725.odt
(29.97 KiB) 183-mal heruntergeladen
BuchstabenAustauschen_1.odg
(174.17 KiB) 173-mal heruntergeladen
Zuletzt geändert von Mau am Di 3. Jul 2018, 11:06, insgesamt 1-mal geändert.

DavidG
Beiträge: 195
Registriert: Do 22. Mär 2018, 21:41

Re: Mehrere Zeichen per Makro ersetzen

Beitrag von DavidG » Mo 2. Jul 2018, 14:26

Hallo Mau,

hier ein Code, welcher per Arrayfeldern das Suchen und Ersetzen übernimmt.
Bitte beachte die Kommentare im Code!

Code: Alles auswählen

REM  *****  BASIC  *****


Sub RegExSuchenErsetzen
Dim oDoc as Object
Dim oCC as Object
Dim oReplace as Object
Dim oSel as Object
Dim mSuche as Variant
Dim mErsetzen as Variant
Dim nCnt as Long

REM Suchen und Ersetzen per Array-Inhalt
REM Die Arrays müssen unbedingt die gleiche Anzahl von Feldern besitzen!!!
REM 
REM Der Zähler eines Arrays beginnt bei 0
REM Es ist darauf zu achten, dass bei nachfolgendem Code, die
REM "Suchfelder" den gleichen Index haben, wie die Ersetzungsfelder:
REM mSuche(0) = mErsetzen(0)
REM mSuche(1) = mErsetzen(1)
REM D.h. im Folgeschluß wird das "A" durch "1" ersetzt.
REM "B" wird durch "2" ersetzt.

REM Hier die Zeichen eintragen die gesucht werden sollen
mSuche = Array("A","B","C","D")

REM Hier die Zeichen eintragen die ersetzt werden sollen
mErsetzen = Array("1","2","3","4")
 	
 	' Referenz auf aktuelles Dokument setzen
	oDoc =thiscomponent
		' Controller Referenz
		oCC=oDoc.getCurrentcontroller()
		
'			' OPTIONAL markierter Bereich
'			oSel=oDoc.getCurrentSelection

	' Text des Dokuments in Variable
	sStr=oDoc.getText().String  
	
	' Referanz des Suchen- und Ersetzen-Objektes
	 oReplace = oDoc.createSearchDescriptor()

' MRI Codeinspektor 
'mri oReplace  

REM .....................................................................................................
REM Such- und Ersetzungsschleife von Arrayfeld (min) bis Arrayfeld (max)
	For nCnt = lBound(mSuche()) to uBound(mSuche())
	With oReplace
		.SearchAll
		.SearchRegularExpression = False
		.SearchString =mSuche(nCnt)
		.ReplaceString = mErsetzen(nCnt)

	End With
		REM Ersetzung im Dokument
		odoc.replaceAll(oReplace)
		
		REM	oSel.replaceAll(oReplace)
	next 

End Sub
Ich weiß nicht in wieweit Du Dich mit Arrays auskennst.
Deshalb:
Ein Array ist quasi eine Tabelle, welche im Speicher angelegt wird.
In Deinem Fall sind es 2 Tabellen mit je einer Spalte und n-Zeilen ( im Beispielcode von mir sind es 4 Zeilen - 0,1,2,3)
Die erste Tabelle soll alle Zeichen enthalten die gesucht werden sollen.
Die Zweite Tabelle soll alle Zeichen enthalten die ersetzt werden sollen.
Die Arrayfelder von beide Tabellen müssen unbedingt die gleiche Anzahl von Feldern (Zeilen) beinhalten,
sonst kommt es zu einem Laufzeitfehler innerhalb der Such-Erstzung-Schleife.
Suchzeichen = A
Ersetzungszeichen = 1
Diese sollten beide im gleichen Feld stehen.
Beispiel:
mSuche(35) = A
mErsetzen(35) = 1
usw.
Auf diese Weise werden immer die richtigen Zeichen gesucht und ersetzt.

Die Arrays sind beliebig erweiterbar.

Aber Achtung!
Satzzeichen, wie Absatzmarken werden auf diese Weise nur bedingt erfasst.
Dafür müsste der Code erweitert werden und mit einer RegEx-Funktion ausgestattet werden!


Gruß
David
Gruß

David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)

Mau
! Supporter - Spende !
Beiträge: 438
Registriert: Do 14. Feb 2013, 19:37

Re: Mehrere Zeichen per Makro ersetzen

Beitrag von Mau » Mo 2. Jul 2018, 22:39

Lieber David,

danke, phantastisch!
Was ein Array ist, weiß ich. Aber trotzdem ganz besonderen Dank für deine vielen Erläuterungen.
Ich vermute, dass ich den Code dadurch ohne weitere Hilfe auf meine Bedürfnisse zuschneiden kann.

Dieses Forum ist einfach toll. Und das OpenDocument-Projekt sowieso. Ich spende deshalb jährlich einen festen Betrag und habe noch keinen einzigen Cent bereut.

Gruß,
Mau

Mau
! Supporter - Spende !
Beiträge: 438
Registriert: Do 14. Feb 2013, 19:37

Re: Mehrere Zeichen per Makro ersetzen

Beitrag von Mau » Di 3. Jul 2018, 12:00

Lieber David,

ein paar Fragen habe ich zu deinem Code.
Vorab eine Bemerkung: Meine Elementarkenntnisse im Programmieren habe ich hauptsächlich durch die Erstellng von Makros in WordPerfect (noch zu (un)seligen MS-DOS-Zeiten). Als WP die Makrosprache auf VBA umstellte, habe ich jahrelang nur noch mit dem Makrorecorder gearbeitet, aber keine eigenen Codes mehr geschrieben, weil die Sprache so komplex ist. Meine jetzigen Kenntnisse verdanke ich der Beschäftigung mit dem Buch von Th. Krumbein, Makros in OpenOffice.org 3, Galileo Computing, 2009.

Ich nummeriere meine Fragen, damit es übersichtlich bleibt. Ich zähle deine Zeilen durch (Zeile 1 ist Sub RegExSuchenErsetzen).
  1. Zeilen 5f.: Dim mSuche as Variant; Dim mErsetzen as Variant
    Du setzt - wie Krumbeil auch - vor die jeweiligen Variablennamen einen Kennbuchstaben, der anzeigt, um welchen Variablentyp es sich handelt. Wofür steht bei dir das m? Bei Krumbeil gibt es den nicht. Ich glaube, er hätte den Buchstaben a dafür gesetzt.
  2. Zeile 7: Dim nCnt as Long
    * Wofür steht das n? Krumbeil hätte wohl ein l gesetzt.
    * nCnt ist ja die Steuervariable für die Array-Schleife. Würde dafür nicht der Typ Integer reichen?
  3. Zeilen 31f. und 56:
    ' OPTIONAL markierter Bereich
    ' oSel=oDoc.getCurrentSelection
    Ich nehme an, die Zeilen 32 und 56 muss ich aktivieren, wenn ich nicht im gesamten Dokument suchen und ersetzen lassen wil, sondern nur in einem markierten Teilabschnitt. Richtig?
  4. Zeilen 40f.:
    ' MRI-Codeinspektor
    ' mri oReplace

    Was ist MRI? Ich finde durch Googlen einen Eintrag darüber in einem SAP-Archiv, bekomme aber leider keinen Zugang. Wenn ich die Anfangszeilen richtig verstanden habe, ist es eine Prozedur, die überprüft, ob eine Variable / Funktion fehlerfrei arbeiten kann.

Gruß,
Mau

DavidG
Beiträge: 195
Registriert: Do 22. Mär 2018, 21:41

Re: Mehrere Zeichen per Makro ersetzen

Beitrag von DavidG » Di 3. Jul 2018, 13:42

Hallo Mau,

Zu 1
Siehe Datentypen

Zu 2
a) Siehe Datentypen
b) Ja, Integer würde auch reichen.

Zu 3

Code: Alles auswählen

' OPTIONAL markierter Bereich
' oSel=oDoc.getCurrentSelection
UND

Code: Alles auswählen

REM	oSel.replaceAll(oReplace)
oSel stellt ein Selection-Objekt per Definition aus oSel=oDoc.getCurrentSelection dar.
Habe dies nur mir reingeschrieben, für den Fall, dass nur in einem markierten Textabschnitt die Such- und Ersetzungsfunktion ausgeführt werden soll.
In diesem Fall müßte vor odoc.replaceAll(oReplace) ein REM oder Hochkomma gesetzt werden, damit es zu einem Kommentar wird.
Bei REM oSel.replaceAll(oReplace) müßte REM entfernt werden.

Zu 4

Code: Alles auswählen

' MRI-Codeinspektor für das Objekt "oReplace"
mri oReplace
MRI ist eine Extension, welche installiert werden kann. Mittels dieses Tools werden
einem alle möglichen Eigenschaften, Methode, Schnittstellen, usw., zum aufgerufenen Objekt, etc. angezeigt.
Beispiel für oReplace-Eigenschaften:
MRI oReplace-Objekt Eigenschaften.jpg
MRI oReplace-Objekt Eigenschaften.jpg (143.03 KiB) 4971 mal betrachtet
Beispiel für oReplace-Methoden:
MRI oReplace-Objekt Methoden.jpg
MRI oReplace-Objekt Methoden.jpg (192.38 KiB) 4971 mal betrachtet
Auf diese Weise, kann man sich z.B. die gewünschten Befehle heraus suchen.
Man sieht welche Eigenschaften einem Objekt hinzugefügt werden können.
Es werden die Datentypen angeziegt, welche für die jeweilige Eigenschaft erforderlich ist.
usw.

Da die Starbasic-API sehr verschachtelt sein kann, kann man mittels MRI per Doppleklick auf einen Eintrag, auch tiefer liegende
Ebenen errreichen.
z.B.
  1. Aufruf: mri thiscomponent
  2. Dann Register "Methods" auswählen und den Eintrag "getCurrentController" suchen
  3. Doppleklick auf "getCurrentController"
  4. Wechsel zum Register "Properties" und suche "Title". Dort steht nun im Klartext der Name des Dokuments.
  5. und tausend Sachen mehr...
Daraus ergibt sich:

Code: Alles auswählen

Option Explicit
Dim oDoc as Objekt
Dim oCC as Object
Dim sTitel as String
	' 1. Ebene || Instanzierung von oDoc
	oDoc = ThisComponent
' mri oDoc

	' 2. Ebene || Instanzierung von oCC
	oCC=oDoc.getCurrentController
' mri oCC

	sTitel=oCC.Title
mri sTitel

	If sTitle ="MeinDokument" then
		Messagebox "Yes: " & sTitle
	Else 
		Messagebox "No: Der Dokumentname lautet: " & sTitle
	End if
Download
MRI 1.3.3
ODER
XrayTool60_de.odt

Ob nun Xray oder MRI zur Inspektion eingesetzt wird ist reine Geschmackssache.
Der Aufruf ist jedenfalls immer gleich:
XRAY oDoc
MRI oDoc

Damit die Inspektiontools immer verfügbar sind, empfiehlt es sich diese bei Programmstart von
LO gleich mit zuladen. Ich habe mir dazu folgendes Makro geschrieben:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub loadLIB
   GlobalScope.BasicLibraries.LoadLibrary("Tools")
	Globalscope.BasicLibraries.LoadLibrary ( "MRILib")
		GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
End Sub
Im der deutschsprachigen Anleitung von XRAY ab Seite 5 ist alles weitere beschrieben. Gleiches gilt für MRI.
Neben XRAY und MRI wird hier noch aus der Standardbibliothek die "Tools Lib" geladen.
Sie enthält viele vorgefertigte Makros, welche von LO mitgeliefert werden.
Es sind dort sehr nützliche Programme zu finden. Stöbern lohnt sich für zukünftige Projkete!

Der Rest ist: üben, üben , üben... ;)
UND diese Seite ist auch sehr nützlich.

Gruß

David
Gruß

David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)

musikai
Beiträge: 262
Registriert: Do 14. Mai 2015, 17:53

Re: Mehrere Zeichen per Makro ersetzen

Beitrag von musikai » Fr 6. Jul 2018, 12:01

DavidG hat geschrieben:
Di 3. Jul 2018, 13:42

Code: Alles auswählen

' OPTIONAL markierter Bereich
' oSel=oDoc.getCurrentSelection
UND

Code: Alles auswählen

REM	oSel.replaceAll(oReplace)
oSel stellt ein Selection-Objekt per Definition aus oSel=oDoc.getCurrentSelection dar.
Habe dies nur mir reingeschrieben, für den Fall, dass nur in einem markierten Textabschnitt die Such- und Ersetzungsfunktion ausgeführt werden soll.
In diesem Fall müßte vor odoc.replaceAll(oReplace) ein REM oder Hochkomma gesetzt werden, damit es zu einem Kommentar wird.
Bei REM oSel.replaceAll(oReplace) müßte REM entfernt werden.

Das wäre schön, wenn dies funktionieren würde. Bei mir kommt allerdings immer:

Code: Alles auswählen

BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: replaceAll.
Win7 Pro, Sibelius 7.1.3, Lubuntu 15.10, LibO 4.4.7, OO 4.1.3
Free Project: LibreOffice Songbook Architect (LOSA)
http://struckkai.blogspot.de/2015/04/li ... itect.html

nikki
Beiträge: 1026
Registriert: Sa 18. Mär 2017, 22:25
Kontaktdaten:

Re: Mehrere Zeichen per Makro ersetzen

Beitrag von nikki » Fr 6. Jul 2018, 17:34

musikai hat geschrieben:
Fr 6. Jul 2018, 12:01
Win7 Pro, Sibelius 7.1.3, Lubuntu 15.10, LibO 4.4.7, OO 4.1.3
Das wäre schön, wenn dies funktionieren würde.
DavidG hat geschrieben:
Di 3. Jul 2018, 13:42
LO 6.0.4.2
Vielleicht solltest Du einfach die LO-Programmversion upgraden.
Gruß

---------------------------------------------------
Win.10 Prof. 64-bit, LO 6.3.4 (x64), LO 6.2.6 Portable, AOO 4.1.7

DavidG
Beiträge: 195
Registriert: Do 22. Mär 2018, 21:41

Re: Mehrere Zeichen per Makro ersetzen

Beitrag von DavidG » Fr 6. Jul 2018, 20:55

@musikai

vielen Dank für Deinen Hinweis.

Habe den Code mittels CurrentSelection unter Writer nicht bei mir ausprobiert,
sondern den Code aus einem Calc-Dokument in abgewandelter Form kopiert.
Ich bin schlicht davon ausgegangen, dass CurrentSelection die Methode "replaceAll" unterstützt.
Dies ist jedoch nicht der Fall.
Auch ein Verweis wie: oSel.getByIndex(0),
zeigt mir per MRI keine Methode/Eigenschaft "replaceAll" an.
Ausserdem kann unter dem Objekt oSel keinen createReplaceDescriptor() erstellen.

Unter Calc funktioniert es:
oReplace = oSel.createReplaceDescriptor()
UND
oSel.replaceAll(oReplace)

Daraus ergibt sich nun die Frage, wie kann man die Methode auf einen markierten Bereich in Writer anwenden?
Im Augenblick habe ich trotz Recherche und einiger Tests noch keine Antwort darauf.
Shame on me :oops:

@nikki
nikki hat geschrieben:Vielleicht solltest Du einfach die LO-Programmversion upgraden.
Leider liegt es nicht an einer veralteten Version.

Hätte ich bloß dieses gut gemeinte oSel weggelassen :lol:

Gruß
David
Nachtrag siehe hier:
INFO: Writer Suchen und Ersetzen in Selektion
Gruß

David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)

Mau
! Supporter - Spende !
Beiträge: 438
Registriert: Do 14. Feb 2013, 19:37

Re: Mehrere Zeichen per Makro ersetzen

Beitrag von Mau » So 8. Jul 2018, 23:07

Lieber David,
DavidG hat geschrieben:
Di 3. Jul 2018, 13:42
Download
MRI 1.3.3
In welches Verzeichnis muss das Tool kopiert und installiert werden?
Ich möchte das Ding vor allem dafür benutzen, um die mächtige Programmiersprache ein bisschen besser zu verstehen.
Wie ihr die Diskussion weiterführt, ist hoch spannend, aber manches - zu vieles - noch ein Buch mit sieben Siegeln für mich.
Es wird noch ein Weilchen dauern, bis ich euren Code ausprobieren kann. Bis dahin Dank an alle Beteiligten!
Mau

DavidG
Beiträge: 195
Registriert: Do 22. Mär 2018, 21:41

Re: Mehrere Zeichen per Makro ersetzen

Beitrag von DavidG » So 8. Jul 2018, 23:39

Hallo Mau,

egal welche Extension (Office-Erweiterung), kannst Du in einen beliebigen
Ordner kopieren. Die Extension trägt die Dateinamenserweiterung .oxt
Wenn Du nur LO bei Dir installiert hast, dann reicht ein Doppelklick auf
die Datei. Es öffnet sich dann LO und MRI wird installiert.
Alternativ kannst Du auch LO öffnen und über das MENÜ Extras --> Extension-Manager öffnen
und per Klick auf hinzufügen den Ordner im Dateifenster angeben, in dem Du MRI kopiert hast.

Hier noch ein paar Links zu Starbasic Informationen und PDF-Files:
https://de.libreoffice.org/get-help/documentation/
Weiter unten auf dieser Seite gibt es auch eine deutsche Übersetzung zum download:
http://www.pitonyak.org/oo.php
Nicht mehr aktuell, aber nützlich:
https://docs.oracle.com/cd/E19253-01/81 ... 7-3924.pdf

http://www.ooowiki.de/StarBasic.html
Mau hat geschrieben:Wie ihr die Diskussion weiterführt, ist hoch spannend, aber manches - zu vieles - noch ein Buch mit sieben Siegeln für mich.
Es wird noch ein Weilchen dauern, bis ich euren Code ausprobieren kann. Bis dahin Dank an alle Beteiligten!
Wie Du gesehen hast, sind die sieben Siegel bei mir auch noch nicht gebrochen.
Man muss nur Wissen wo man die Informationen herbekommt und dann möglichst am Ball bleiben.

Es hat mich gefreut, dass wir uns gegenseitig geholfen haben.
Deine Frage hat letzendlich dazu geführt, dass ich mein Wissen in Sachen "Selektion" erweitern konnte.

VIele Grüße und viel Spaß

David
Gruß

David
___________________
WIN 10 PRO
LO 7.4.5.1 (x64)

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten