Suchen und ersetzen im Arbeitsspeicher

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: Suchen und ersetzen im Arbeitsspeicher

Re: Suchen und ersetzen im Arbeitsspeicher

von balu » So, 17.11.2019 20:51

Nabend Marcel,

so so. Es gibt jetzt hier keine Datenbank. Macht aber nix, da ich im groben den Aufbau verstehe.

Die Sache mir 'ReplaceString()' werd ich mir vielleicht mal noch genauer anschauen, je nach dem wie meine Lust dazu ist. Eilt ja auch nicht.

Der Code für "HTML-TAGS zu filtern" hört sich interessant an. Werd mal schauen ob ich den bei einer anderen Sache verwenden kann. Aber Lust ....

Ich bleib erstmal bei meinem letzten Code. Er kann so leicht *ratz-fatz* in andere Makros übernommen werden.



Gruß
balu

Re: Suchen und ersetzen im Arbeitsspeicher

von marcel_at_work » So, 17.11.2019 14:57

Hallöchen balu,

ich könnte dir die besagte Datenbanktabelle schicken, aber zur Ansicht benötigt man einen installierten MySQL-Server. Ich kann sie selbst nicht mehr einsehen, da ich die Technik des damaligen Projektes nicht mehr benutze (mir zu umständlich).

Mir ist nach Ansicht des restlichen Programmcodes ein kleiner Fehler in meiner Argumentation aufgefallen: Die besagte Tabelle besteht aus allen möglichen Codierungen, mit ID, Zeichen, Unicode, HTML,... usw. (aber der grundlegende Aufbau ist identisch mit deinem Array, nur eben mit weiteren Dimensionen)
In meiner oben beschriebenen Schleife gab es zwar, wie gesagt, nur einen Schleifendurchlauf, aber zwei Werte, die pro Zeile ggf. ausgetauscht/ersetzt werden mussten:

Code: Alles auswählen

ID	Zeichen	Unicode	HTML	UTF8	...
1	ä	U+00E4 	ä	C3A4
Aber diese Werte könnten natürlich auch alle samt untereinander in einer einzigen Tabellenspalte (oder auch einem Array) stehen:

Code: Alles auswählen

ID	Zeichen	Code
1	ä	U+00E4 
2	ä	ä
...
Mir ist jetzt leider nicht bekannt, welche Probleme du mit "ReplaceString()" hattest, aber mit dieser Funktion könnte man in deiner REPLACE()-Prozedur die äussere Schleife weglassen?!

Diese ganze Sache mit dem Writer-Dokument habe ich deshalb aufgeführt, weil du in der Einleitung davon geschrieben hast, "Inhalte von einer Internetseite zu extrahieren" und dies bedeutet für mich erst einmal, den Inhalt von HTML-TAGS zu filtern, was sich eben mit dem SearchDescriptor im Writer-Dokument am weitaus effektivsten lösen lässt, wie z.B. mit:

Code: Alles auswählen

'Extrahierung des HTML-"Body" aus dem Quelltext:
SearchDesc.SearchString = "<body(\n*|\t*|.*)*</body>"
FoundDesc = oTempQuelltext.findFirst(SearchDesc)
If Not isNull(FoundDesc) Then
	sHtmlBody = FoundDesc.String
End If
Aber falls dies gar nicht so zutrifft, kannst du meine Ideen einfach ignorieren! :lol:

Liebe Grüße,

Marcel

Re: Suchen und ersetzen im Arbeitsspeicher

von balu » Sa, 16.11.2019 18:39

Hallo Marcel,
daß du einfach nur Zeichen in einem String austauschen möchtest?
Stimmt.

ich habe den Thread jetzt nur mal kurz überflogen
Dann ist dir wohl das hier entgangen, gleich zu Anfang in meinem Eröffnungsbeitrag.
balu hat geschrieben: Dieser Text befindet sich aber weder in Calc noch im Writer, sondern er wird aus einer Online HTML-Seite (WWW) ausgelesen und er befindet sich in folge dessen im Arbeitsspeicher.
Mit anderen Worten es setzt wohl als minimum das hier voraus.

Code: Alles auswählen

Open sWebUrl For Input As iNumber
Anschließend wurde durch eine Schleife über eine Datenbanktabelle aller Codierungen (analog zu deinem Array, aber mit komplettem Unicode-Zeichensatz) einfach...
[...]
... aufgerufen.
Und wie sieht diese Datenbanktabelle aus?

An 'ReplaceString()' hatte ich jetzt gar nicht gedacht. Ich glaube das ich mal damit gearbeitet hatte, aber auch meine Probleme damit hatte. Ist jetzt auch nicht so wichtig (meine Probleme damit).

Dein Vorschlag ist wohl vielleicht nicht ganz uninteressant, aber ohne zu wissen wie die Datenbanktabelle auszusehen hat ist es eigentlich "nutzlos". Du sprichst ja auch von 'einer Datenbanktabelle aller Codierungen', aber wenn ich dich jetzt richtig verstehe müstte ich wohl mit 2 solcher Datenbanktabellen arbeiten, da es sich, siehe meinen letzten Code, um ZWEI verschiedene UTFs handelt. Oder wie verhält sich das bei dir?

Und außerdem ging es mir ja auch im wesentlichem nur darum, nur bestimmte Zeichen zu ersetzen von denen ich weiss das sie vorkommern. Ich muss also keine Tabelle mit 256 Verglerichszeichen/Austauschzeichen besitzen oder intergrieren um nur 13 Zeichen zu behandeln. Und ich brauch auch nicht den Umweg über eine zusätzliche Writerdatei zu gehen, da es ausschließlich NUR um diese paar Zeichen geht, und nicht mehr. Der Umweg mit der Writerdatei mag wohl je nach Situation gar nicht mal so verkehrt sein, aber in diesem Falle ist das am Thema vorbei: "Suchen und ersetzen im Arbeitsspeicher"

Das alles soll jetzt nicht heißen das ich deine Bemühungen nicht würdige, aber momentan sehe ich keinen Vorteil für mich. Was aber schon interessant wäre, wenn Du eine Beispieldatei hier anhängen würdest. Denn mein letzt geposteter Code ist ein so genannter "Stand-allone-Code" der so direkt ausführbar ist, um selber mal ein bisschen zu experimentieren. Deine Beschreibung ist aber so nicht lauffähig. Deine Beispieldatei würde ich dann aber meinerseits als erlaubtes "Off-Toppic " betrachten. :lol:



Gruß
balu

Re: Suchen und ersetzen im Arbeitsspeicher

von marcel_at_work » Sa, 16.11.2019 16:29

Hallöchen Balu,

ich habe den Thread jetzt nur mal kurz überflogen und hoffe, es richtig verstanden zu haben, daß du Webcontent bearbeiten möchtest?

Ich hatte vor ein paar Jahren mal ein Projekt für die Extrahierung von Webcontent in eine Datenbank und dies wie folgt realisiert:

Per...

Code: Alles auswählen

Dim myFileProp(0) as new com.sun.star.beans.PropertyValue
myFileProp(0).Name = "Hidden"
myFileProp(0).value = True
oTempQuelltext = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, myFileProp())
oQuelltextCursor = oTempQuelltext.Text.createTextCursor()
... wurde im Hintergrund eine unsichtbare Writer-Datei geöffnet und mit...

Code: Alles auswählen

iNumber = Freefile
Open sWebUrl For Input As iNumber
While NOT eof(iNumber)
	Line Input #iNumber, sTextzeile
	If sTextzeile <> "" Then sQuelltext = sQuelltext & sTextzeile & Chr(10)
Wend
Close #iNumber
... der Text vom Host in eine String-Variable hineingeladen.
Anschließend wurde durch eine Schleife über eine Datenbanktabelle aller Codierungen (analog zu deinem Array, aber mit komplettem Unicode-Zeichensatz) einfach...

Code: Alles auswählen

Do While oResultSignCodes.next()
	sQuelltext = replaceString(sQuelltext,oResultSignCodes.getString(2),oResultSignCodes.getString(4))
Loop
oQuelltextCursor.String = sQuelltext 'Übertragung des neuen Quelltextes in das nicht sichtbare Writer-Dokument
... aufgerufen.
"ReplaceString()" aus der Bibliothek Tools ersetzt alle Zeichenfolgen aus der Quell-Zeichenfolge auf einmal. Man benötigt also nur eine Anweisung pro Code-Zeichen und muss nicht in der Quell-Zeichenfolge suchen.

Und da der Text sowieso im Writer-Dokument vorliegt, kann man anschließend leistungsstarke "reguläre Ausdrücke" benutzen, falls man den Text noch weiterbearbeiten möchte.

Liebe Grüße,

Marcel

Re: Suchen und ersetzen im Arbeitsspeicher

von balu » Mo, 04.11.2019 22:19

Hallo!

Ja, ja!
Hin und wieder sind es doch nur kleinigkeiten die einem das Leben erst erschweren, aber auf der anderen Seite auch erleichtern können. Hört sich paradox an, aber so ist es mir grad eben ergangen.

Ich zitiere mich mal selbst.
balu hat geschrieben: Mi, 30.05.2018 10:43 das die gezeigte mögliche Lösung für den Fall ist, wenn man sich nicht sicher ist wieviele Ersetzungen gemacht werden müssen.
Und gemeint war damit folgender Code.
balu hat geschrieben: Mi, 30.05.2018 00:23

Code: Alles auswählen

sub tete2
	dim NCRdez(1 to 2, 1 to 13) as String

	NCRdez(1,1) =  "&#181;" : NCRdez(2,1) =  "µ"
	NCRdez(1,2) =  "&#188;" : NCRdez(2,2) =  "¼"
	NCRdez(1,3) =  "&#189;" : NCRdez(2,3) =  "½"
	NCRdez(1,4) =  "&#190;" : NCRdez(2,4) =  "¾"
	NCRdez(1,5) =  "&#196;" : NCRdez(2,5) =  "Ä"
	NCRdez(1,6) =  "&#214;" : NCRdez(2,6) =  "Ö"
	NCRdez(1,7) =  "&#216;" : NCRdez(2,7) =  "Ø"
	NCRdez(1,8) =  "&#220;" : NCRdez(2,8) =  "Ü"
	NCRdez(1,9) =  "&#223;" : NCRdez(2,9) =  "ß"
	NCRdez(1,10) =  "&#228;" : NCRdez(2,10) =  "ä"
	NCRdez(1,11) =  "&#246;" : NCRdez(2,11) =  "ö"
	NCRdez(1,12) =  "&#248;" : NCRdez(2,12) =  "ø"
	NCRdez(1,13) =  "&#252;" : NCRdez(2,13) =  "ü"

sTmpNameX = "W&#228;ster &#220;berflutet &#214;rtliche Augen&#228;rzte, und nu is nix mehr wei&#223;."
'____________________________________________________________________________________________	
	ix = 0	
	for r = 1 to Len(sTmpNameX)
		if Mid(sTmpNameX, r, 2) = "&#" then
			ix = ix + 1
		end if						
	next r
print "IX = Insgesamt zu ersetzende NCRdez-Codes:  " & ix ' <- Diese Zeile braucht man nicht unbedingt. Kann also gelöscht werden.
'____________________________________________________________________________________________
	sTmpX = sTmpNameX
		for r2 = 1 to ix				
			for r3 = 1 to 13
				sTmpX2 = REPLACE(sTmpX,  NCRdez(1, r3),  NCRdez(2, r3))
				sTmpX = sTmpX2									
			next r3						
		next r2				
	PRINT sTmpX	
end sub
Den Zähler 'ix' braucht man nicht. Den kann man sich einsparen. Und außerdem kann man den eigentlichen Ersetzungs-Code so ändern, das man gar nicht auf einen vergleichenden Text a-la '= "&#" then' angewiesen ist.
Hier ist der komplette Ersetzungs-Code.

Code: Alles auswählen

		for r2 = 1 to Len(sTmpX)				
			for r3 = 0 to 12
				sTmpX2 = REPLACE(sTmpX,  aUTF(0, r3),  aUTF(1, r3))
				sTmpX = sTmpX2									
			next r3						
		next r2
Mehr braucht es nicht :-)

Aber warum '0 to 12'?
Ganz einfach.
Das ist die maximale größe des Array. Mal einfach ausgedrückt.

Code: Alles auswählen

aUTF = DimArray(1, 12)
Und was hat das nun mit "dem Leben erschweren" zu tun?
Tja, das ist wie folgt.
Ein UTF-Code kann ja folgendes sein 'ä'. Was dem kleinem 'ä' entspricht.
Wenn man jetzt aber aus "unerklärlichen" Gründen auch noch das in einem Text stehen hat &Oslash;' (steht für Ø), dann ist es Essig mit 2 Zeichen abzählen. Also war das für mich zu anfangs ein Problem. Doch nach ein paar tests kam ich auf die "simple" gezeigte Lösung. Und wär ich nicht auf dies kleine Problem gestoßen, hätte ich mich noch mit der bisherigen alten Lösung rumgeschlagen. Jetzt erleichtert mir die Lösung das leben. :-)

Hier noch mal der komplette Code mit einem Beispieltext.

Code: Alles auswählen

Sub Main
aUTF = DimArray(1, 12)
aUTF(0,0)= "ä"  : aUTF(1,0)= "ä"
aUTF(0,1)= "Ä"  : aUTF(1,1)= "Ä"
aUTF(0,2)= "ö"  : aUTF(1,2)= "ö"
aUTF(0,3)= "Ö"  : aUTF(1,3)= "Ö"
aUTF(0,4)= "ü"  : aUTF(1,4)= "ü"
aUTF(0,5)= "Ãœ"  : aUTF(1,5)= "Ü"
aUTF(0,6)= "ß"  : aUTF(1,6)= "ß"
aUTF(0,7)= "Ë?"  : aUTF(1,7)= "½"
aUTF(0,8)= "Ľ"  : aUTF(1,8)= "¼"
aUTF(0,9)= "ľ"  : aUTF(1,9)= "¾"
aUTF(0,10)= "Å™"  : aUTF(1,10)= "ø"
aUTF(0,11)= "Å ~"  : aUTF(1,11)= "Ø"
aUTF(0,12)= "&Oslash;"  : aUTF(1,12)= "Ø"

sTmpX = "Ronden &Oslash; 50 mm Automatenstahl 11SMn30+C gesägt Länge 50 mm"
'____________________________________________________________________________________________		
		for r2 = 1 to Len(sTmpX)				
			for r3 = 0 to 12
				sTmpX2 = REPLACE(sTmpX,  aUTF(0, r3),  aUTF(1, r3))
				sTmpX = sTmpX2									
			next r3						
		next r2
	PRINT sTmpX	
End Sub


Gruß
balu

Re: Suchen und ersetzen im Arbeitsspeicher

von balu » Mi, 30.05.2018 17:43

Hallo mikeleb,
ich mag auf die Schnelle etwas übersehen
Nö Du! Nix übersehen.

die Zahl im HTML-Code entspricht doch dem ASCII-Code des Zeichens.
Das hast Du jetzt mit deinem Code auch ausdrucksvoll unter Beweis gestellt. Und ganz ehrlich gesagt; ich war weder damals noch Heute nicht darauf gekommen. Nennt man das schon "Betriebsblindheit" :oops: , oder wie?

Im ernst. Das ist wahrlich eine gute Beobachtung von dir. Und deine alternative ist auch wirklich schön kurz und elegant. Räschbäck.
Ich habe deinen Lösungsvorschlag mir in meiner Code-Sammlung gespeichert 8) .



Wir haben hier uns ja bis hier her auf die Ersetzung der NCRdez, genauer gesagt NCR dez (Ohne Leerzeichen dawischen) konzentriert. Jedoch bei der Ersetzung von UTF-8 (als normales ASCII dargestellt) ist dein möglicher Lösungsvorschlag nicht anwendbar. Ich will deine Leistung aber auf gar keinen Fall schmälern, oder herabsetzen, das liegt mir wirklich sehr Fern.

Nun, dieser 'besondere' UTF-8 sieht ja beispielsweise so aus: ü
Und bei dieser Kodierung gibt es keinen gemeinsamen Nenner wie bei 'NCR dez' diese Kombination &#. Da hilft dann alles nix, da muss dann wieder mit Array gearbeitet werden, wie bisher gezeigt.

Code: Alles auswählen

aUTF = DimArray(1, 11)
aUTF(0,0)= "ä"  : aUTF(1,0)= "ä"
aUTF(0,1)= "Ä"  : aUTF(1,1)= "Ä"
aUTF(0,2)= "ö"  : aUTF(1,2)= "ö"
aUTF(0,3)= "Ö"  : aUTF(1,3)= "Ö"
aUTF(0,4)= "ü"  : aUTF(1,4)= "ü"
aUTF(0,5)= "Ãœ"  : aUTF(1,5)= "Ü"
aUTF(0,6)= "ß"  : aUTF(1,6)= "ß"
aUTF(0,7)= "Ë?"  : aUTF(1,7)= "½"
aUTF(0,8)= "Ľ"  : aUTF(1,8)= "¼"
aUTF(0,9)= "ľ"  : aUTF(1,9)= "¾"
aUTF(0,10)= "Å™"  : aUTF(1,10)= "ø"
aUTF(0,11)= "Å ~"  : aUTF(1,11)= "Ø"
Der Ersetzungs-Code wäre dann der gleiche wie von mir zuvor gezeigt.
Ich erwähne das extra, weil die Seite von wo ich damals die Zeichen auslesen wollte, mittlerweile ihren Zeichensatz auf diesen UTF-8 umgestellt hat, gleichzeitig mit dem Wechsel von HTTP auf HTTPS. Ich brauchte jetzt also aktuell nur das Array anpassen und in der REPLACE nur NCRdez gegen aUTF tauschen, fertig.


Es gillt also wie so üblich: "Viele Wege führen nach Rom." Nur welchen man begeht, das muss man selber entscheiden.



Gruß
balu

Re: Suchen und ersetzen im Arbeitsspeicher

von mikeleb » Mi, 30.05.2018 16:33

Hallo Balu,

ich mag auf die Schnelle etwas übersehen, aber: die Zahl im HTML-Code entspricht doch dem ASCII-Code des Zeichens. Damit bietet sich die Funktion chr() an.
Unter der Annahme, dass es sich um einen genau dreistelligen Code handelt:

Code: Alles auswählen

Sub Main
	sTmpNameX = "W&#228;ster &#220;berflutet &#214;rtliche Augen&#228;rzte, und nu is nix mehr wei&#223;."
	aTmp=split(sTmpNameX,"&#")
	for i=1 to ubound(aTmp)
		aTmp(i)=chr(val(aTmp(i))) & mid(aTmp(i),5)
	next
	sTmpX=join(aTmp(),"")
End Sub

Re: Suchen und ersetzen im Arbeitsspeicher

von balu » Mi, 30.05.2018 10:43

Moin moin.

Was ich vorhin (wegen früh am morgen) vergessen hatte ist, das die gezeigte mögliche Lösung für den Fall ist, wenn man sich nicht sicher ist wieviele Ersetzungen gemacht werden müssen.

Weiss man aber das ein Umlaut und ein Sonderzeichen maximal 2 mal vorkommt, dann kann man den Code auf das hier kürzen.

Code: Alles auswählen

sub tete2
	dim NCRdez(1 to 2, 1 to 13) as String

	NCRdez(1,1) =  "&#181;" : NCRdez(2,1) =  "µ"
	NCRdez(1,2) =  "&#188;" : NCRdez(2,2) =  "¼"
	NCRdez(1,3) =  "&#189;" : NCRdez(2,3) =  "½"
	NCRdez(1,4) =  "&#190;" : NCRdez(2,4) =  "¾"
	NCRdez(1,5) =  "&#196;" : NCRdez(2,5) =  "Ä"
	NCRdez(1,6) =  "&#214;" : NCRdez(2,6) =  "Ö"
	NCRdez(1,7) =  "&#216;" : NCRdez(2,7) =  "Ø"
	NCRdez(1,8) =  "&#220;" : NCRdez(2,8) =  "Ü"
	NCRdez(1,9) =  "&#223;" : NCRdez(2,9) =  "ß"
	NCRdez(1,10) =  "&#228;" : NCRdez(2,10) =  "ä"
	NCRdez(1,11) =  "&#246;" : NCRdez(2,11) =  "ö"
	NCRdez(1,12) =  "&#248;" : NCRdez(2,12) =  "ø"
	NCRdez(1,13) =  "&#252;" : NCRdez(2,13) =  "ü"

sTmpNameX = "W&#228;ster &#220;berflutet &#214;rtliche Augen&#228;rzte, und nu is nix mehr wei&#223;."
'____________________________________________________________________________________________	
	sTmpX = sTmpNameX
		for r2 = 1 to 2
			for r3 = 1 to 13
				sTmpX2 = REPLACE(sTmpX,  NCRdez(1, r3),  NCRdez(2, r3))
				sTmpX = sTmpX2									
			next r3						
		next r2				
	PRINT sTmpX	
end sub



Ist man sich aber sicher das jeder Umlaut und jedes Sonderzeichen nur einmal vorkommt, dann geht es sogar noch etwas kürzer.

Code: Alles auswählen

sub tete2
	dim NCRdez(1 to 2, 1 to 13) as String

	NCRdez(1,1) =  "&#181;" : NCRdez(2,1) =  "µ"
	NCRdez(1,2) =  "&#188;" : NCRdez(2,2) =  "¼"
	NCRdez(1,3) =  "&#189;" : NCRdez(2,3) =  "½"
	NCRdez(1,4) =  "&#190;" : NCRdez(2,4) =  "¾"
	NCRdez(1,5) =  "&#196;" : NCRdez(2,5) =  "Ä"
	NCRdez(1,6) =  "&#214;" : NCRdez(2,6) =  "Ö"
	NCRdez(1,7) =  "&#216;" : NCRdez(2,7) =  "Ø"
	NCRdez(1,8) =  "&#220;" : NCRdez(2,8) =  "Ü"
	NCRdez(1,9) =  "&#223;" : NCRdez(2,9) =  "ß"
	NCRdez(1,10) =  "&#228;" : NCRdez(2,10) =  "ä"
	NCRdez(1,11) =  "&#246;" : NCRdez(2,11) =  "ö"
	NCRdez(1,12) =  "&#248;" : NCRdez(2,12) =  "ø"
	NCRdez(1,13) =  "&#252;" : NCRdez(2,13) =  "ü"

sTmpNameX = "W&#228;ster &#220;berflutet &#214;rtliche Optiker, und nu is nix mehr wei&#223;."
'____________________________________________________________________________________________	
	sTmpX = sTmpNameX
		for r3 = 1 to 13
			sTmpX2 = REPLACE(sTmpX,  NCRdez(1, r3),  NCRdez(2, r3))
			sTmpX = sTmpX2									
		next r3						
	PRINT sTmpX	
end sub
Hier habe ich den Beispieltext etwas abgewandelt.
Wie man sieht ist das der mit Abstand kürzeste Code, aber nur unter der eben genannten Bedingung.



Gruß
balu

Re: Suchen und ersetzen im Arbeitsspeicher

von balu » Mi, 30.05.2018 00:23

Hallo!

Auch wenn es schon eine weile her ist, so möchte ich dennoch eine weitere mögliche Lösung zeigen.
Das verrückte an der Sache ist jetzt aber, die Lösung hatte ich eigentlich schon zu Anfang gepostet, der Code muss lediglich ein klein wenig entschlackt werden.

Ich zitiere mich jetzt mal selbst.
Als erstes wird überprüft ob der Text überhaupt HTML-Codes hat, die mit &# anfangen. Und wenn ja, wie oft kommt das vor.
Das bleibt bestehen. Denn das "wie oft" wird gleich noch benötigt.

Als nächstes, wenn die Bedingung zutrifft, wird mit der gleichen Methode wie vorher noch mal der HTML-Code abgezählt. Nur werden jetzt aber ab der Fundstelle wo der HTML-Code beginnt, 6 Zeichen ausgelesen und mit einem 2 Spaltigem Array verglichen und gegen das richtige Zeichen ausgetauscht. Das geschieht mittels REPLACE.
Die Funktion REPLACE bleibt das Dreh und Angelzentrum. Jedoch werden nun keine 6 Zeichen gesucht und ersetzt. Denn da ja ein vorgegebenes Array mit den Codes und den Ersetzungen schon existiert, braucht REPLACE nur zu vergleichen ob z.B. das Wort &#181; in dem *zerstümmelten* Text vorhanden ist. Und wenn ja, dann wird es halt ganz einfach durch das passende Zeichen aus dem Array ersetzt.

REPLACE schreibt den jetzt geänderten Text in einen Temporären String. Und wenn noch nicht alle HTML-Codes mittels REPLACE getauscht wurden, wird dieser Temporäre String ein erneutes mal überprüft, abgezählt und getauscht.
Das erneute überprüfen und abzählen entfällt einfach. Aber der Temporäre String muss bestehen bleiben, da es ohne ihm nicht geht.

Erst wenn der gesamte String "Buchstabe für Buchstabe" abgearbeitet wurde, wird der so bereinigte String mittels PRINT ausgegeben.
Der bereinigte String wird auch wieder mit PRINT ausgegeben, aber das mit dem "Buchstabe für Buchstabe" entfällt ganz einfach, da ja "Wörter" aus den Array getauscht werden.

Hier noch mal der Ursprüngliche Code (überflüssige Leerzeilen entfernt), damit man nicht andauernd nach oben scrollen muss.

Code: Alles auswählen

sub tete2
    dim NCRdez(1 to 2, 1 to 13) as String

    NCRdez(1,1) =  "&#181;" : NCRdez(2,1) =  "µ"
    NCRdez(1,2) =  "&#188;" : NCRdez(2,2) =  "¼"
    NCRdez(1,3) =  "&#189;" : NCRdez(2,3) =  "½"
    NCRdez(1,4) =  "&#190;" : NCRdez(2,4) =  "¾"
    NCRdez(1,5) =  "&#196;" : NCRdez(2,5) =  "Ä"
    NCRdez(1,6) =  "&#214;" : NCRdez(2,6) =  "Ö"
    NCRdez(1,7) =  "&#216;" : NCRdez(2,7) =  "Ø"
    NCRdez(1,8) =  "&#220;" : NCRdez(2,8) =  "Ü"
    NCRdez(1,9) =  "&#223;" : NCRdez(2,9) =  "ß"
    NCRdez(1,10) =  "&#228;" : NCRdez(2,10) =  "ä"
    NCRdez(1,11) =  "&#246;" : NCRdez(2,11) =  "ö"
    NCRdez(1,12) =  "&#248;" : NCRdez(2,12) =  "ø"
    NCRdez(1,13) =  "&#252;" : NCRdez(2,13) =  "ü"

sTmpNameX = "W&#228;ster &#220;berflutet &#214;rtliche Augen&#228;rzte, und nu is nix mehr wei&#223;."
'____________________________________________________________________________________________    
    ix = 0    
    for r = 1 to Len(sTmpNameX)
        if Mid(sTmpNameX, r, 2) = "&#" then
            ix = ix + 1
        end if                        
    next r
            print "IX = Insgesamt zu ersetzen:  " & ix
'____________________________________________________________________________________________'
            if ix >= 1 then
                sTmpX = sTmpNameX                                            
                for iti = 1 to ix                            
                    for r2 = 1 to Len(sTmpX)                    
                        if Mid(sTmpX, r2, 2) = "&#" then                        
                            sErsetzen = Mid(sTmpX, r2, 6)                            
                                for r3 = 1 to 13        
                                    if sErsetzen = NCRdez(1, r3) then
                                        sTmpX2 = REPLACE(sTmpX,  NCRdez(1, r3),  NCRdez(2, r3))
                                        sTmpX = sTmpX2
                                    end if                                    
                                next r3
                        end if                        
                    next r2                    
                next iti
                    PRINT sTmpX                
            else                        
                Print "Nix is!"
            end if
end sub

Und hier jetzt der gekürzte Code.

Code: Alles auswählen

sub tete2
	dim NCRdez(1 to 2, 1 to 13) as String

	NCRdez(1,1) =  "&#181;" : NCRdez(2,1) =  "µ"
	NCRdez(1,2) =  "&#188;" : NCRdez(2,2) =  "¼"
	NCRdez(1,3) =  "&#189;" : NCRdez(2,3) =  "½"
	NCRdez(1,4) =  "&#190;" : NCRdez(2,4) =  "¾"
	NCRdez(1,5) =  "&#196;" : NCRdez(2,5) =  "Ä"
	NCRdez(1,6) =  "&#214;" : NCRdez(2,6) =  "Ö"
	NCRdez(1,7) =  "&#216;" : NCRdez(2,7) =  "Ø"
	NCRdez(1,8) =  "&#220;" : NCRdez(2,8) =  "Ü"
	NCRdez(1,9) =  "&#223;" : NCRdez(2,9) =  "ß"
	NCRdez(1,10) =  "&#228;" : NCRdez(2,10) =  "ä"
	NCRdez(1,11) =  "&#246;" : NCRdez(2,11) =  "ö"
	NCRdez(1,12) =  "&#248;" : NCRdez(2,12) =  "ø"
	NCRdez(1,13) =  "&#252;" : NCRdez(2,13) =  "ü"

sTmpNameX = "W&#228;ster &#220;berflutet &#214;rtliche Augen&#228;rzte, und nu is nix mehr wei&#223;."
'____________________________________________________________________________________________	
	ix = 0	
	for r = 1 to Len(sTmpNameX)
		if Mid(sTmpNameX, r, 2) = "&#" then
			ix = ix + 1
		end if						
	next r
print "IX = Insgesamt zu ersetzende NCRdez-Codes:  " & ix ' <- Diese Zeile braucht man nicht unbedingt. Kann also gelöscht werden.
'____________________________________________________________________________________________
	sTmpX = sTmpNameX
		for r2 = 1 to ix				
			for r3 = 1 to 13
				sTmpX2 = REPLACE(sTmpX,  NCRdez(1, r3),  NCRdez(2, r3))
				sTmpX = sTmpX2									
			next r3						
		next r2				
	PRINT sTmpX	
end sub
Der Zähler ix muss deshalb bestehen bleiben, da in meinem Beispieltext das Wort &#228; gleich 2 mal vorkommt. Nur dadurch werden diese beiden Wörter durch das ä ersetzt. Ohne ix, genauer gesagt ohne die for r2 = 1 to ix gibt es nur eine Ersetzung.

Sieht doch eigentlich ganz gut aus, oder? 8)



Gruß
balu

Re: Suchen und ersetzen im Arbeitsspeicher

von Karolus » So, 28.08.2016 22:45

Stephan hat geschrieben:
… Im übrigen gehört das nicht hierher.
Nun, entweder oder ;-)

Entweder Du bringst hier Python ins Gespräch oder nicht, wenn Du es tust dann rede aber bitte auch darüber wenn man Dich fragt. Nö, müssen musst Du selbstverständlich nicht, ist nur eine Bitte.
Ich hab hier das python-beispiel gebracht, um zu zeigen wie simpel, einfach und robust es in python bereits implementiert ist html-text mit escape-sequenzen in "lesbaren" Text umzuwandeln (und umgekehrt) nicht um nochmals zu beantworten wie man Scripte in Dokumente einbettet, oder wie man sie gestalten muss damit Funktionen daraus aus Aoo|Lo aufrufbar sind - richtig man muss den Code in Funktionen stecken, genauso wie man das auch in Basic machen muss ( sub|function )


Stephan hat geschrieben: Und am Rande:
da musst du dir schon deine eigene Werkzeugkiste zusammenbauen
ja, das ist so, aber die Mehrzahl braucht dazu Hilfe, braucht namentlich Hilfe bei ganz banalen Dingen der Benutzung von Python.
Und solche Hilfe kann für die Helfer nervig sein wenn die Hilfesuchenden immer wieder Dasselbe fragen, nur leider ist das die Praxis, nicht nur für Python sondern auch für z.B. Basic.
Für Letzteres hat das Forum hier, im deutschsprachigen Bereich, im Laufe der Jahre viel getan, denn ich erinnere mich noch wie dünn gesät deutschsprachige StarBasic-Doku war als ich hier ins Forum einstieg.

Ich fände es schön wenn es uns hier gelingen würde, den Nutzern auch für Python zunehmend besser zu helfen, allein kann ich persönlich dazu wenig beitragen, weil ich selbst nur ganz wenig von Python verstehe.
Es braucht dazu, meiner Meinung nach, gerade auch ganz elementare Hilfe und Erklärungen zu Grundlagen, beispielsweise wie in:
viewtopic.php?f=25&p=261789#p261789
oder eben auch:
viewtopic.php?f=27&t=64426&p=248231&hil ... on#p248231
Stephan hat geschrieben: naja, und eben Beharrlichkeit immer und immer wieder die gleichen Fragen in Threads zu beantworten, wenn wieder einmal Frager drängeln, aber gleichzeitig nur wenig bereit sind zunächst selbst zu suchen.
Diese Beharrlichkeit ist mir abhanden gekommen***, es gibt in diesem Forum alleine von mir 179 Beiträge mit dem Suchwort
python
Fügst du dann noch den Suchbegriff "hanya" hinzu bekommst du 3 Links zu einem recht praktischen Dialog zur Verwaltung, Organisation und Einbettung von python-scripten.

***ich verdiene damit auch nicht meine Brötchen, das muss ich "nebenbei" in einem Job mit teilweise ungewöhnlichen Arbeitszeiten machen (Landwirtschaft)

Re: Suchen und ersetzen im Arbeitsspeicher

von Stephan » So, 28.08.2016 13:04

… Im übrigen gehört das nicht hierher.
Nun, entweder oder ;-)

Entweder Du bringst hier Python ins Gespräch oder nicht, wenn Du es tust dann rede aber bitte auch darüber wenn man Dich fragt. Nö, müssen musst Du selbstverständlich nicht, ist nur eine Bitte.


Ich selbst wollte schon ähnlich fragen wie clag, denn zwar weiß ich wohl ein bisschen mehr als er zu Python und komme mit einfachen Python-Scripts für Calc inzwischen leidlich klar, nur das konkrete Script hier habe ich auch nicht zum Laufen bekommen.


Und am Rande:
da musst du dir schon deine eigene Werkzeugkiste zusammenbauen
ja, das ist so, aber die Mehrzahl braucht dazu Hilfe, braucht namentlich Hilfe bei ganz banalen Dingen der Benutzung von Python.
Und solche Hilfe kann für die Helfer nervig sein wenn die Hilfesuchenden immer wieder Dasselbe fragen, nur leider ist das die Praxis, nicht nur für Python sondern auch für z.B. Basic.
Für Letzteres hat das Forum hier, im deutschsprachigen Bereich, im Laufe der Jahre viel getan, denn ich erinnere mich noch wie dünn gesät deutschsprachige StarBasic-Doku war als ich hier ins Forum einstieg.

Ich fände es schön wenn es uns hier gelingen würde, den Nutzern auch für Python zunehmend besser zu helfen, allein kann ich persönlich dazu wenig beitragen, weil ich selbst nur ganz wenig von Python verstehe.
Es braucht dazu, meiner Meinung nach, gerade auch ganz elementare Hilfe und Erklärungen zu Grundlagen, beispielsweise wie in:
viewtopic.php?f=25&p=261789#p261789

naja, und eben Beharrlichkeit immer und immer wieder die gleichen Fragen in Threads zu beantworten, wenn wieder einmal Frager drängeln, aber gleichzeitig nur wenig bereit sind zunächst selbst zu suchen.



Gruß
Stephan

Re: Suchen und ersetzen im Arbeitsspeicher

von Karolus » So, 28.08.2016 07:02

Hallo
Aber wenn die Basic Function ersteinmal erstellt ist, nimmt es sich im Aufruf wohl nicht mehr viel.
Die Pythonlösung ist rund 70 bis 80 mal schneller… reicht das als Argument?
Ich kann in einem neuen zB Calc Dokument kein Python Makro erstellen (alles ausgegraut) irgend etwas fehlt da scheinbar, nur was?
Es ist hinlänglich bekannt das Aoo|Lo bis dato keinerlei eigene (IDE) zur Erstellung von Pythoncode bietet, da musst du dir schon deine eigene Werkzeugkiste zusammenbauen. … Im übrigen gehört das nicht hierher. (anderes Thema)

Re: Suchen und ersetzen im Arbeitsspeicher

von clag » Sa, 27.08.2016 10:45

Hallo Karolus,

Der Pythonvorteil ist hier eigentlich doch gar nicht so groß, denn die Routine zum umwandeln der html Adressstrings ist ja nicht weniger auwendig als die hier gezeigten Basic Routinen, man müsste in dem Array halt nur alle Zeichen efassen. ok in Python sie ist bereits implementiert.
Aber wenn die Basic Function ersteinmal erstellt ist, nimmt es sich im Aufruf wohl nicht mehr viel.

Wie bekomme ich deinen Code zum laufen?
Ich kann in einem neuen zB Calc Dokument kein Python Makro erstellen (alles ausgegraut) irgend etwas fehlt da scheinbar, nur was?

Kannst du bitte zusätzlich einmal zeigen wie man eine Abfrage in den Python Code einbaut,
der die Routine in eine5000 WindowsSystemTicks währende Schleife schickt und zählt wie oft Routine abgearbeitet wurde?

Re: Suchen und ersetzen im Arbeitsspeicher

von Karolus » Fr, 26.08.2016 23:10

Hallo

Letzlich ist es auch in python nicht so einfach - aber die ganze*** Komplexität zum escapen|unescapen von html-text|Normaltext wird eben schlicht vom "eingebauten" html-modul erledigt.

***und nicht nur die Behandlung der gerade mal 13 Sonderzeichen wie im gezeigten Basic-code.

unten der Link zum Pastebin mit dem kompletten Quellcode aus dem html-modul:
app.php/pastebin/?mode=view&s=32

Re: Suchen und ersetzen im Arbeitsspeicher

von balu » Fr, 26.08.2016 12:06

Mahlzeit!

Erstmal ein recht Herzliches Danke schön für Eure Antworten und Lösungsvorschläge. :)

Es sind ja recht interessante Wege aufgezeigt worden wie ich das auch anders angehen kann. Dabei ist mir aufgefallen, das ich mich zu sehr auf REPLACE eingeschossen habe da dies für viele andere Zwecke von mir schon eingesetzt wird.
Ja, ja! Mal öfters die Scheuklappen absetzen.

Die Methode von Stephan, habe ich in ähnlicher weise früher schon mal wo anders eingesetzt, blos mit dem Unterschied das ich da nicht mit einem "2 Spaltigem" Array gearbeitet habe. Und ich war auch eigentlich mit dem Ergebnis weitestgehend zufrieden, nur hätte ich das niemandem zeigen wollen da ja mehrfach mit "IF ... THEN" und "FOR ... NEXT" gearbeitet wird. Und genau das gefiel mir nicht so richtig, da dies irgendwie nach "Unwissenden Anfänger" aussieht. Aber es geht halt manchmal nicht anders, so wie ich das jetzt sehen konnte, und brauche mich innerlichg diesbezüglich nicht mehr so sehr zu schämen.


Tja, und clag zeigt mir einen Weg an den ich gar nicht dachte. SPLIT & JOIN sind für mich bis jetzt noch keine so guten Freunde gewesen, da mir das ganze irgendwie zu unverständlich und kompliziert erschien. Jedoch, sieht jetzt die Welt auf einmal ganz anders aus, und deshalb werde ich diese Methode übernehmen.

Danke dafür, clag. :D


Ach ja, der liebe Karolus durfte ja nicht fehlen. Ich hatte ja eigentlich schon fast fest damit gerechnet.;-)
Entschuldige das ich dich jetzt mit dieser unsäglich komplizierten und zeitaufwändigen python-Lösung erschlage…
Nein, nein! Du hast mich nicht erschlagen!
Bin nur äußerst überrascht wie einfach das mit der Schlange geht. Auch wenn ich es nicht angewendet habe, so verstehe ich vom Prinzip aus her wie es funktioniert. Es wird auf den wohl vorhandenen "Zeicheninterpreter" (oder wie man das nennen kann/darf/soll) zugegriffen und alle dementsprechenden Zeichen getauscht. Eine solche Bibliothek ist natürlich sehr vorteilhaft.

Auch wenn die Schlange in vielerlei Dingen einfach unschlagbar ist, so glaube mir Bitte das ich persönliche Gründe dafür habe (die ich nicht in der öffentlichkeit erläutern will) das ich mich so schnedll nicht weiter mit ihr befassen möchte. In ferner Zukunft mag das vielleicht anders aussehen, aber jetzt nicht.



Gruß
balu

Nach oben