Suchen und ersetzen im Arbeitsspeicher

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

Moderator: Moderatoren

Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Suchen und ersetzen im Arbeitsspeicher

Beitrag von balu »

Hallo liebe Gemeinde,

ja, auch ich hab mal wieder ein kleines Problem.

Und zwar will ich in einem Text etwas suchen und ersetzen. 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.

Nun ja, ich habe da wohl etwas was funktioniert, aber ich frage mich ob man das nicht auch vereinfachen kann. Es geht darum das bestimmte HTML-Codes für deutsche Umlaute (und ein paar Sonderzeichen) ersetzt werden sollen. Eigentlich heißt das zu ersetzende "NCR dez", aber der einfachheithalber bleibe ich im weiteren Verlauf bei HTML-Code.

Als minimalstes Beispiel:
ß steht für ß
Also aus weiß soll weiß werden.

Bei nur einem HTML-Code ist das ja gar kein Problem. Aber anders sieht das aus, wenn man z.B. so einen Text nehmen würde:

Wäster Überflutet Örtliche Augenärzte, nix ist mehr weiß.


Übersetzt heißt er:

Wäster Überflutet Örtliche Augenärzte, nix ist mehr weiß.


Mein gesamter Code dafür sieht wie folgt aus (Beispieldatei im Anhang).

Code: Alles auswählen

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

    NCRdez(1,1) =  "µ" : NCRdez(2,1) =  "µ"
    NCRdez(1,2) =  "¼" : NCRdez(2,2) =  "¼"
    NCRdez(1,3) =  "½" : NCRdez(2,3) =  "½"
    NCRdez(1,4) =  "¾" : NCRdez(2,4) =  "¾"
    NCRdez(1,5) =  "Ä" : NCRdez(2,5) =  "Ä"
    NCRdez(1,6) =  "Ö" : NCRdez(2,6) =  "Ö"
    NCRdez(1,7) =  "Ø" : NCRdez(2,7) =  "Ø"
    NCRdez(1,8) =  "Ü" : NCRdez(2,8) =  "Ü"
    NCRdez(1,9) =  "ß" : NCRdez(2,9) =  "ß"
    NCRdez(1,10) =  "ä" : NCRdez(2,10) =  "ä"
    NCRdez(1,11) =  "ö" : NCRdez(2,11) =  "ö"
    NCRdez(1,12) =  "ø" : NCRdez(2,12) =  "ø"
    NCRdez(1,13) =  "ü" : NCRdez(2,13) =  "ü"

sTmpNameX = "Wäster Überflutet Örtliche Augenärzte, und nu is nix mehr weiß."
'sTmpNameX = ""

'____________________________________________________________________________________________    
    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
Ich gehe also nach folgendem Schema vor.

Als erstes wird überprüft ob der Text überhaupt HTML-Codes hat, die mit &# anfangen. Und wenn ja, wie oft kommt das vor.

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.

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.

Erst wenn der gesamte String "Buchstabe für Buchstabe" abgearbeitet wurde, wird der so bereinigte String mittels PRINT ausgegeben.


Wie schon gesagt, er funktioniert. Aber so richtig elegant sieht er nicht aus. Und da ja nicht in einem Dokument gearbeitet wird, obwohl das Makro aus einer Calc-Datei gestartet wird, kann ich auch nicht mit einem createReplaceDescriptor arbeiten.


Wer hätte da einen Vorschlag das eleganter zu lösen?
Aber bitte kein Python, dafür habe ich momentan keine Zeit und Lust.


Ach ja, beinahe vergessen.
Der gezeigte Text ist von der Länge und der Anzahl an HTML-Codes schon reichlich übertrieben. Im Durchschnitt ist er eigentlich bedeutend kürzer.


Freue mich schon auf Eure Antworten und Hilfe. :)



Gruß
balu
Dateianhänge
suchen-und-ersetzen-html.ods
(7.97 KiB) 353-mal heruntergeladen
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
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von Stephan »

Wenn es nur um das Ersetzen von HML-Codes der Form "ß" geht (es gibt ja auch noch die Art "ß") dann würde ich so vorgehen das ich immer einen 'Block' von 6 Zeichen prüfe, denn die gesuchten Ausdrücke sind ja zwingend von 6 Zeichen Länge.

Code: Alles auswählen

Sub Main
  Msgbox ersetzen("Wäster Überflutet Örtliche Augenärzte, nix ist mehr weiß.")
End Sub

Function ersetzen(rohtext As String) As String 
    dim NCRdez(1 to 2, 1 to 13) as String

    NCRdez(1,1) =  "µ" : NCRdez(2,1) =  "µ"
    NCRdez(1,2) =  "¼" : NCRdez(2,2) =  "¼"
    NCRdez(1,3) =  "½" : NCRdez(2,3) =  "½"
    NCRdez(1,4) =  "¾" : NCRdez(2,4) =  "¾"
    NCRdez(1,5) =  "Ä" : NCRdez(2,5) =  "Ä"
    NCRdez(1,6) =  "Ö" : NCRdez(2,6) =  "Ö"
    NCRdez(1,7) =  "Ø" : NCRdez(2,7) =  "Ø"
    NCRdez(1,8) =  "Ü" : NCRdez(2,8) =  "Ü"
    NCRdez(1,9) =  "ß" : NCRdez(2,9) =  "ß"
    NCRdez(1,10) =  "ä" : NCRdez(2,10) =  "ä"
    NCRdez(1,11) =  "ö" : NCRdez(2,11) =  "ö"
    NCRdez(1,12) =  "ø" : NCRdez(2,12) =  "ø"
    NCRdez(1,13) =  "ü" : NCRdez(2,13) =  "ü"

  z = LEN(rohtext)	
  For i = 0 to z-6
    tmp = RIGHT(Left(rohtext, i+6),6)
    If left(tmp,2) = "&#" And Right(tmp,1) = ";" Then
        For r3 = 1 to 13
          If tmp = NCRdez(1, r3) then
            neu_text = neu_text & NCRdez(2, r3)
            i = i + 5
          End If
        Next r3
      Else
        neu_text = neu_text & Left(tmp, 1)
    End If
  Next i
  ersetzen = neu_text
End Function
Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von clag »

Hallo Balu,

in Anlehnung an Stephans Idee hier eine Variante die so glaube ich weit weniger Runden dreht, sollte also etwas fixer sein ;)

Code: Alles auswählen

Function ersetzen(rohtext As String) As String
    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) =  "ü"

    aWorkString = split(rohtext,"&#")
    for i=0 to uBound(aWorkString)
      sFour = left(aWorkString(i),4) 
      for t=1 to 13
        if sFour(i) = NCRdez(1,t) then mid(aWorkString(i),1,4, NCRdez(2,t)) 
      next
    next
	ersetzen = join(aWorkString, "")
End Function
edit:
kleine Korrektur vorgenommen
if sFour(i) = NCRdez(1,t) then mid(aWorkString(i),1,5, NCRdez(2,t)) falsch
if sFour(i) = NCRdez(1,t) then mid(aWorkString(i),1,4, NCRdez(2,t)) korrekt
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von Karolus »

Hallo

Code: Alles auswählen

import html

httext = ("Wäster Überflutet &#214"
          ";rtliche Augenärzte"
          ", und nu is nix mehr weiß.")
    
print(html.unescape(httext))
→→
Wäster Überflutet Örtliche Augenärzte, und nu is nix mehr weiß.'
Balu hat geschrieben:Aber bitte kein Python, dafür habe ich momentan keine Zeit und Lust.
Entschuldige das ich dich jetzt mit dieser unsäglich komplizierten und zeitaufwändigen python-Lösung erschlage…
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
gschuckar
****
Beiträge: 140
Registriert: Fr, 24.02.2006 14:27

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von gschuckar »

Moin Karolus,
meist lese ich hier nur, weil ich programmiere gerne in/ mit Java. Hier findet sich wenig zu diesem Thema. Macht nix. Seit einiger Zeit beschäftige ich mich, auch auf Grund Deiner sehr informativen Posts, mit python. Was soll ich sagen, das funktioniert, warum auch nicht. Der Grund, aus dem ich mich jetzt hier mal melde ist:
Karolus hat geschrieben:Entschuldige das ich dich jetzt mit dieser unsäglich komplizierten und zeitaufwändigen python-Lösung erschlage…
Ich finde Deine Art immer wieder erquickend. Verlasse bitte nie dieses Forum:-))
Gruß
Gerd
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von balu »

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
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
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von Karolus »

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
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von clag »

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?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von Karolus »

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)
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von Stephan »

… 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
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von Karolus »

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)
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von balu »

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 µ 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) =  "µ" : NCRdez(2,1) =  "µ"
    NCRdez(1,2) =  "¼" : NCRdez(2,2) =  "¼"
    NCRdez(1,3) =  "½" : NCRdez(2,3) =  "½"
    NCRdez(1,4) =  "¾" : NCRdez(2,4) =  "¾"
    NCRdez(1,5) =  "Ä" : NCRdez(2,5) =  "Ä"
    NCRdez(1,6) =  "Ö" : NCRdez(2,6) =  "Ö"
    NCRdez(1,7) =  "Ø" : NCRdez(2,7) =  "Ø"
    NCRdez(1,8) =  "Ü" : NCRdez(2,8) =  "Ü"
    NCRdez(1,9) =  "ß" : NCRdez(2,9) =  "ß"
    NCRdez(1,10) =  "ä" : NCRdez(2,10) =  "ä"
    NCRdez(1,11) =  "ö" : NCRdez(2,11) =  "ö"
    NCRdez(1,12) =  "ø" : NCRdez(2,12) =  "ø"
    NCRdez(1,13) =  "ü" : NCRdez(2,13) =  "ü"

sTmpNameX = "Wäster Überflutet Örtliche Augenärzte, und nu is nix mehr weiß."
'____________________________________________________________________________________________    
    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) =  "µ" : NCRdez(2,1) =  "µ"
	NCRdez(1,2) =  "¼" : NCRdez(2,2) =  "¼"
	NCRdez(1,3) =  "½" : NCRdez(2,3) =  "½"
	NCRdez(1,4) =  "¾" : NCRdez(2,4) =  "¾"
	NCRdez(1,5) =  "Ä" : NCRdez(2,5) =  "Ä"
	NCRdez(1,6) =  "Ö" : NCRdez(2,6) =  "Ö"
	NCRdez(1,7) =  "Ø" : NCRdez(2,7) =  "Ø"
	NCRdez(1,8) =  "Ü" : NCRdez(2,8) =  "Ü"
	NCRdez(1,9) =  "ß" : NCRdez(2,9) =  "ß"
	NCRdez(1,10) =  "ä" : NCRdez(2,10) =  "ä"
	NCRdez(1,11) =  "ö" : NCRdez(2,11) =  "ö"
	NCRdez(1,12) =  "ø" : NCRdez(2,12) =  "ø"
	NCRdez(1,13) =  "ü" : NCRdez(2,13) =  "ü"

sTmpNameX = "Wäster Überflutet Örtliche Augenärzte, und nu is nix mehr weiß."
'____________________________________________________________________________________________	
	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
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
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von balu »

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
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
mikeleb
*******
Beiträge: 1315
Registriert: Fr, 09.12.2011 16:50

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von mikeleb »

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

Re: Suchen und ersetzen im Arbeitsspeicher

Beitrag von balu »

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
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
Antworten