Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Teil eines Textes auslesen

Begonnen von Tante, September 21, 2022, 15:30:58

⏪ vorheriges - nächstes ⏩

Tante

Hallo zusammen,

ich möchte einen Teil eines Textes aus eine Tabelle auslesen und komme nicht weiter.
Hier mein Beispiel:


<Value Name=""Version"">v1.0</Value>"
<Value Name=""VersionType"">String</Value>"
<Value Name=""VersionStr"">F1</Value>"
<Value Name=""InstallMechanism"">IMM</Value>"
<Value Name=""InstallMediaName"">PPKS1890</Value>"
<Value Name=""RetainOnUpgrade"">False</Value>"
<Value Name=""AssociatedData""></Value>"
<Value Name=""AssociatedData""></Value>"
<Value Name=""DisplayNameOverride""></Value>"
<Value Name=""Classification""></Value>"
<Value Name=""Version""></Value>"
<Value Name=""VersionType"">NA</Value>"
<Value Name=""InstallMechanism"">IMM</Value>"
<Value Name=""InstallMediaName"">OPPKS15559000</Value>"
<Value Name=""RetainOnUpgrade"">False</Value>"
<Value Name=""AssociatedData""></Value>"


Der Text hinter "InstallMediaName" und </Value> also "PPKS1890" und "OPPKS15559000" soll entweder herausgefiltert oder mit eine Abfrage abgefragt werden.
Könnt Ihr mir da helfen?

Vielen Dank.


andyfau

Hallo,

google mal nach "textdatei parsen access vba". Dann gibts zig Beispiele....

Beste Grüße
Andreas
Beste Grüße
Andreas

Tante

Danke Andyfau,

aber komme so leider nicht weiter. Habe jetzt einige Seiten durchgesucht finde aber nichts brauchbares für meinen Fall. Vielleicht kannst du bzw. jemand anders noch einen Tipp geben.

Gruß

MzKlMu

Hallo,
ist der oben gezeigte Text in einem Feld oder sind das mehrere Felder.
Bitte mal genauer erklären.
Gruß Klaus

Tante

Hallo,

das ist ein Feld, also alles untereinander und ca. 1800 Einträge.

PhilS

Zitat von: Tante am September 21, 2022, 17:19:27Vielleicht kannst du bzw. jemand anders noch einen Tipp geben.
Die InStr-Funktion sollte dir beim Kern der Problemstellung weiterhelfen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Tante

Danke,
aber mein SearchString ist doch jedes mal anders weil es viele unterschiedliche Einträge gibt.
Wie kann ich den Wert x zwischen <Value Name=""InstallMediaName"">    und    </Value>" herausfiltern.


Wenn ich den Befehl richtig verstanden habe geht das nicht damit.

Dim SearchString, SearchChar, MyPos
SearchString ="XXpXXpXXPXXP"    ' String to search in.
SearchChar = "P"    ' Search for "P".


Sorry, stehe da voll auf dem Schlauch.


PhilS

Zitat von: Tante am September 21, 2022, 18:32:45Wie kann ich den Wert x zwischen <Value Name=""InstallMediaName"">    und    </Value>" herausfiltern.
Indem du InStr benutzt, um zuerst die Position von <Value Name=""InstallMediaName""> zu ermitteln, dann um die Position um das folgende </Value> zu finden (Start-Argument für InStr verwenden) .

Mit der Mid-Funktion kannst du dann den Text zwischen der Start- und der Endposition auslesen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

PhilS

    Const HAYSTACK As String = "<Value Name=""Version"">v1.0</Value> und so weiter ....

    Const STARTPATTERN As String = "<Value Name=""InstallMediaName"">"
    Const ENDPATTERN As String = "</Value>"
   
    Dim startPos As Long
    Dim endPos As Long
   
    Do
        startPos = InStr(startPos + 1, HAYSTACK, STARTPATTERN) + Len(STARTPATTERN)
        If startPos > Len(STARTPATTERN) Then
            endPos = InStr(startPos, HAYSTACK, ENDPATTERN)
            Debug.Print Mid(HAYSTACK, startPos, (endPos - startPos))
        End If
    Loop Until startPos = Len(STARTPATTERN)
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ebs17

Wenn Philipp schon den Begriff Pattern ins Spiel bringt, könnte man auch mit RegEx lösen.

Da aber mehr als ein Treffer ausgegeben werden soll, kommt man mit einer einfachen Funktion nicht hin. Ehe man sich also mit einem konkreten Code beschäftigen würde, sollte man wissen,
- woher genau und auf welchem Wege die Verarbeitung laufen soll und
- wohin genau die Rückgabewerte eingebunden werden sollen.
Mit freundlichem Glück Auf!

Eberhard

Tante

Danke Philipp. Ich habe das allerdings nicht hinbekommen. Ich kenne mich jetzt auch nicht super aus mit VBA. Habe den Code in VBA eingefügt und hatte das dann als Modul. Wenn ich es ausführe passiert nichts. Ich bin mir nicht sicher ob ich irgendetwas nicht beachte.





Zitat von: PhilS am September 21, 2022, 19:27:44    Const HAYSTACK As String = "<Value Name=""Version"">v1.0</Value> und so weiter ....

    Const STARTPATTERN As String = "<Value Name=""InstallMediaName"">"
    Const ENDPATTERN As String = "</Value>"
   
    Dim startPos As Long
    Dim endPos As Long
   
    Do
        startPos = InStr(startPos + 1, HAYSTACK, STARTPATTERN) + Len(STARTPATTERN)
        If startPos > Len(STARTPATTERN) Then
            endPos = InStr(startPos, HAYSTACK, ENDPATTERN)
            Debug.Print Mid(HAYSTACK, startPos, (endPos - startPos))
        End If
    Loop Until startPos = Len(STARTPATTERN)

Tante

Danke. Die Daten kommen aus einer Excel Tabelle mit einer Spalte und 1800 Zeilen.
Nach dem Import in Access habe ich ein Feld mit 1800 Zeilen. Jede Value Name ist eine einzelne Zeile.

<Value Name=""InstallMechanism"">IMM</Value>"
<Value Name=""InstallMediaName"">PPKS1890</Value>"

Idealerweise sollte die Rückgabe in eine Tabelle ausgegeben werden, die dann diese Werte z.B.(PPKS1890) mit einer anderen Tabelle über einen Abfrage vergleicht, ob diese Werte dort vorhanden sind.

Hoffe ich konnte es einigermaßen verständlich beschreiben.





Zitat von: ebs17 am September 22, 2022, 09:52:27Wenn Philipp schon den Begriff Pattern ins Spiel bringt, könnte man auch mit RegEx lösen.

Da aber mehr als ein Treffer ausgegeben werden soll, kommt man mit einer einfachen Funktion nicht hin. Ehe man sich also mit einem konkreten Code beschäftigen würde, sollte man wissen,
- woher genau und auf welchem Wege die Verarbeitung laufen soll und
- wohin genau die Rückgabewerte eingebunden werden sollen.
Zitat von: ebs17 am September 22, 2022, 09:52:27Wenn Philipp schon den Begriff Pattern ins Spiel bringt, könnte man auch mit RegEx lösen.

Da aber mehr als ein Treffer ausgegeben werden soll, kommt man mit einer einfachen Funktion nicht hin. Ehe man sich also mit einem konkreten Code beschäftigen würde, sollte man wissen,
- woher genau und auf welchem Wege die Verarbeitung laufen soll und
- wohin genau die Rückgabewerte eingebunden werden sollen.
Zitat von: ebs17 am September 22, 2022, 09:52:27Wenn Philipp schon den Begriff Pattern ins Spiel bringt, könnte man auch mit RegEx lösen.

Da aber mehr als ein Treffer ausgegeben werden soll, kommt man mit einer einfachen Funktion nicht hin. Ehe man sich also mit einem konkreten Code beschäftigen würde, sollte man wissen,
- woher genau und auf welchem Wege die Verarbeitung laufen soll und
- wohin genau die Rückgabewerte eingebunden werden sollen.

PhilS

Zitat von: Tante am September 22, 2022, 10:03:35Wenn ich es ausführe passiert nichts. Ich bin mir nicht sicher ob ich irgendetwas nicht beachte.
Der Code gibt die gesuchten Werte im Direktfenster der VBA-Umgebung aus. - Wenn du das nicht eingeblendet hast, siehst du nix.

Um das Direktfenster einzublenden, entweder Menü "Ansicht" - "Direktfenster" oder [STRG]+[G] auf der Tastatur verwenden.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ebs17

#13
ZitatJede Value Name ist eine einzelne Zeile
Zeile gleich Datensatz?
Dann würde man also nicht einen 1.800-Zeilen-Text auswerten, sondern die Zeilen auf das benötigte filtern.
WHERE Instr(1, FeldY, "InstallMediaName") > 0Damit braucht man sich nur noch mit den interessierenden zwei Datensätzen beschäftigen.

Als Abfrage etwa (ungetestet)
SELECT
   FeldY,
   RegExReplace(FeldY, "^.*>([A-Z0-9]+)<.*$", "$1") AS Content
FROM
   TabelleX
WHERE
   Instr(1, FeldY, "InstallMediaName") > 0
RegExReplace aus Codebeispiel - "Intelligente" Textanalyse, ersten Codeblock in ein Standardmodul übernehmen
Mit freundlichem Glück Auf!

Eberhard

Tante

Sie dürfen in diesem Board keine Dateianhänge sehen.

Ich bekomme diese Fehlermeldung- Meine Tabelle heißt Tabelle1 und mein Feld heißt Feld1.