Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1932to1936
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Reg. Ausdruck für Suche in Json Datei

Reg. Ausdruck für Suche in Json Datei
06.06.2023 13:40:47
Robert

Hallo,
ich durchsuche eine Json Datei (TopoJson). Der gesamte Text der Json-Datei ist in einer Variablen "neuerText" gespeichert.
Mittels eines reg. Ausdrucks möchte jede Eigenschaft auslesen
Beispielaufbau:
"properties": {
"name": "Wels-Land",
"iso": "418"
}
und die Werte für name (hier "Wels-Land") und iso Wert (418) in Variablen speichern.
Danach möchte ich den namen verändern, zB "Wels-Land" durch "Wels" in der variable neuerText (an der Fundstelle) ersetzen.

Bin für jede Hilfe dankbar.
Vielen Dank.

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Reg. Ausdruck für Suche in Json Datei
06.06.2023 20:04:05
Zwenn
Hallo Robert,

eine JSON Datei hat einen definierten Aufbau, da es sich um ein standardisiertes Datenaustauschformat handelt. Der Inhalt ist aus verschachtelten Dictionaries und Arrays aufgebaut. Klingt kompliziert, hilft aber bei der einfachen Verarbeitung. In einem JSON wird ein Dictionary in geschweifte Klammern {} eingeschlossen. Ein Array in eckige Klammern []. In einem Dictionary ist ein Wert immer einem Schlüssel zugeordnet, wobei jeder Schlüssel nur einmal in einem Dictionary vorkommen kann. In Deinem Auszug ist z.B. iso ein Schlüssel und 418 der zugehörige Wert. In einem Array sind die Werte Indizes zugeordnet.

Um ein JSON in VBA zu parsen, hat Tim Hall den JSONConverter entwickelt. Dieser ist kostenfrei und wurde auf GitHub zur Verfügung gestellt. Das Makro erstellt Dictionaries und statt Arrays Collections. Collections sind aufgebaut wie Arrays, also über Indizes, lassen sich aber dynamisch erweitern. In Dictionaries lassen sich Werte einfach über den Schlüssel überschreiben. In Collections sind Werte schreibgeschützt, können aber gelöscht werden und es können wie gesagt neue Werte hinzugefügt werden. Wenn ich es richtig verstanden habe, willst Du Werte in Dictionaries ersetzen. Das ist einfach.

Das JSON Format: https://de.wikipedia.org/wiki/JavaScript_Object_Notation
Zu Dictionaries: https://excelmacromastery.com/vba-dictionary/
Zu Collections: https://excelmacromastery.com/excel-vba-collections/
JSONConverter: https://github.com/VBA-tools/VBA-JSON (Du brauchst nur die JSONConverter.bas, die als Modul importiert wird)
Distionary: https://github.com/VBA-tools/VBA-Dictionary (Auch von Tim Hall, als Klasse importieren, um den Excel Verweis zu umgehen)

Hier ist ein Beispiel, wie mit dem JSONConverter gearbeitet wird, um alle gleichartigen Werte aus einem JSON auszulesen:
https://stackoverflow.com/questions/76298919/vba-api-call-displayed-weather-in-excel/76299645#76299645

Wenn Du die gewünschten Werte geändert hast, kannst Du das geänderte JSON mit dem JSONConverter auch wieder ausgeben lassen. Lies dazu die Beispiele auf der GitHub Seite.

Den Link zum zu verarbeitenden JSON kannst Du auch direkt im Browser aufrufen. Das Textknäul kannst Du in einen JSON Formatter werfen, dann bekommst Du eine strukturierte Ausgabe. Zum Beispiel in diesen:
https://jsonformatter.curiousconcept.com/

Ich weiß, das ist jetzt vermutlich erstmal Information Overkill, aber versuche den StackOverflow Post im Zusammenhang mit dem JSON zu verstehen. Alle anderen Links enthalten viele Infos, die Du für dieses Projekt bei weitem nicht alle benötigst oder dienen einfach dem grundlegenden Verständnis der Zusammenhänge.

Viele Grüße,

Zwenn


Anzeige
AW: Reg. Ausdruck für Suche in Json Datei
06.06.2023 20:05:12
Nepumuk
Hallo Robert ,

teste mal:

Option Explicit

Public Sub Extract()

    Dim objFileSystemObject As Object, objFile As Object, objTextStream As Object
    Dim objRegExp As Object, objMatch As Object, objMatchCollection As Object
    Dim strText As Variant, strFile As String

    strFile = "H:\test.json" 'Anpassen !!!

    Set objFileSystemObject = CreateObject(Class:="Scripting.FileSystemObject")
    Set objFile = objFileSystemObject.GetFile(strFile)
    Set objTextStream = objFile.OpenAsTextStream(1, -2)

    strText = objTextStream.ReadAll

    Set objTextStream = Nothing
    Set objFile = Nothing
    Set objFileSystemObject = Nothing

    Set objRegExp = CreateObject(Class:="VBScript.RegExp")

    With objRegExp

        .MultiLine = True
        .Global = True
        .IgnoreCase = True
        .Pattern = """" & "properties" & """" & ": {\r?\n?" & """" & "name" & """" & ": " & """" & _
            "([\w-]+?)" & """" & ",\r?\n?" & """" & "iso" & """" & ": " & """" & "(\d+)" & """" & "\r?\n?}"

        Set objMatchCollection = .Execute(strText)

    End With

    For Each objMatch In objMatchCollection

        MsgBox objMatch.SubMatches(0)
        MsgBox objMatch.SubMatches(1)

    Next

    Set objRegExp = Nothing
    Set objMatchCollection = Nothing

End Sub
Gruß
Nepumuk

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige