2015-05-28 6 views
5

Meine Firma hat einen Anbieter, der einen JSON-Feed mit Daten bereitstellt, den ich alle zwei Stunden in unsere MS Access-Datenbank laden muss. Ich muss:JSON-Feed automatisch in MS Access analysieren

  1. Last die Daten aus dem Futter,
  2. die JSON in ein brauchbares Format für Access analysieren und dann
  3. sie in die Datenbank einfügen.

Ich kam in this question ein ähnliches Problem zu diskutieren, aber es gibt keine gute Beschreibung gibt, wie dies in MS Access zu implementieren. Jede Hilfe dankbar geschätzt!

+0

Sie könnten auch die JSON-Module sehen hier: https://github.com/CactusData/VBA.CVRAPI ... Sammlungen unter Verwendung der Daten zu halten. Es dauert ein wenig, aber VBA und JSON sind nicht füreinander gemacht - es gibt keine einfachen oder intelligenten Lösungen. – Gustav

+0

Können Sie einige Beispiel-JSON wie Sie haben, und resultierende DB-Tabelle (n), die Sie als Ergebnis erhalten möchten? Betrachten Sie [diese Methode] (http://stackoverflow.com/a/30494373/2165759) auch. – omegastripes

+0

Ihre Frage impliziert, dass Sie mit VBA nicht zufrieden sind, irre ich mich darin? –

Antwort

6

Mit der Bibliothek VBA JSON können Sie JSON-formatierte Dateien sicher in MS Access importieren. Die Idee besteht darin, JSON-Daten als eine Sammlung von Wörterbüchern zu betrachten, und Visual Basic stellt die Daten collection und dictionary als Datenstrukturen zur Verfügung.

Im Folgenden sind die Schritte:

  1. eine Tabelle Erstellen Sie die Struktur der erwarteten JSON-Daten
  2. Auf der VBA IDE Seite von MS Access entsprechen, importieren Sie die JsonConverter.bas (von Link oben) in ein neues Modul
  3. Noch in der IDE, unter Extras/Verweise, die VBA-Referenz abhaken: Microsoft Scripting Runtime
  4. den folgenden Code enthalten, die den J liest SON-Textdatei analysiert sie als eine Sammlung von Wörterbüchern (mit Schlüsseln und Valeus) und fügt Werte iterativ in die Access-Tabelle ein. Platz Code hinter einem Access-Formular oder Modul (Beispiel verwendet eine eine verschachtelte Ebene JSON-Datei)

JSON

[ 
    { 
    "col1": somenumber, 
    "col2": "somestring", 
    "col3": "somestring", 
    "col4": "somestring", 
    "col5": "somestring" 
    } 
] 

VBA-Code

Private Function JSONImport() 
    Dim db As Database, qdef As Querydef 
    Dim FileNum As Integer 
    Dim DataLine As String, jsonStr As String, strSQL As String 
    Dim p As Object, element As Variant   

    Set db = CurrentDb 

    ' READ FROM EXTERNAL FILE 
    FileNum = FreeFile() 
    Open "C:\Path\To\JsonFile.json" For Input As #FileNum 

    ' PARSE FILE STRING 
    jsonStr = "" 
    While Not EOF(FileNum) 
     Line Input #FileNum, DataLine 

     jsonStr = jsonStr & DataLine & vbNewLine 
    Wend 
    Close #FileNum 
    Set p = ParseJson(jsonStr) 

    ' ITERATE THROUGH DATA ROWS, APPENDING TO TABLE 
    For Each element In p 
     strSQL = "PARAMETERS [col1] Long, [col2] Text(255), [col3] Text(255), " _ 
          & "[col4] Text(255), [col5] Text(255); " _ 
        & "INSERT INTO TableName (col1, col2, col3, col4, col5) " _ 
          & "VALUES([col1], [col2], [col3], [col4], [col5]);" 

     Set qdef = db.CreateQueryDef("", strSQL) 

     qdef!col1 = element("col1") 
     qdef!col2 = element("col2") 
     qdef!col3 = element("col3") 
     qdef!col4 = element("col4") 
     qdef!col5 = element("col5") 

     qdef.Execute 
    Next element 

    Set element = Nothing 
    Set p = Nothing 
End Function 
+0

Dumme Frage ... wie benutzt du diese Bibliothek? – Hill

+1

Wie die "Readme" sagt: Importieren Sie JsonConverter.bas in Ihr Projekt (Open VBA Editor, Alt + F11; Datei> Datei importieren); Wörterbuch hinzufügen Verweis/Klasse (einen Verweis auf "Microsoft Scripting Runtime" enthalten) –

-2

Json-Datei in MS Umgang Der Zugang ist einfach. benennen Sie die .json Erweiterung .txt und verwenden Sie die Text Importfunktion mit dem Begrenzer auf (:) und dem Text Trennzeichen ("). eine Zeile Code ... Happy Codierung!

+1

Willkommen bei Stack Overflow! Während dies ein wertvoller Hinweis zur Lösung des Problems sein könnte, zeigt eine gute Antwort auch die Lösung. Bitte [bearbeiten], um Beispielcode anzugeben, um zu zeigen, was Sie meinen. Alternativ können Sie dies auch als Kommentar schreiben. –

+0

In dieser Antwort wird davon ausgegangen, dass es sich bei den Daten um eine Flat-Datei handelt und daher kein Parsing erforderlich ist. Der Punkt von JSON sind strukturierte Daten. Diese Antwort ist also nicht hilfreich. – Smandoli

0

I Ich bin nicht erlaubt zu kommentieren, aber das ist eher ein kleiner Vorschlag zu Parfait Lösung oben. Ich hatte Probleme beim Ausführen des Codes, weil Jsonconverter fehlte.Verfolgen Sie die Schritte von Parfait, stellen Sie sicher, dass Sie auch JsonConverter als ein Modul in Access VBA enthalten. Sie können diese Module in der Excel-Datei von VBA-JSON bereitgestellt finden

Befolgen Sie diese Schritte VBA-JSON unter Zugang zu installieren.

  • Laden Specs.bas als ein Modul (Import ..
  • )
  • Excel öffnen, drücken Sie Alt + F11, öffnen Modul JSONConverter, Kopieren alle (STRG + A, STRG + C)
  • OpenAccess-, drücken Sie Alt + F11, Erstellen neuer Module, Name es JsonConverter, Einfügen aller Code (STRG + V)
  • Referenz Microsoft Scripting Runtime

In Ihrem Code, wenn ParseJson nicht gefunden wird, benutzen Sie diese Referenz:

Dim p As Object 
Set p = JSonConverter.ParseJson(jsonStr) 

Das ist mein voller Code:

Public Sub import() 
    ''''CREATE TABLE START'''' 
    Dim myTable As TableDef 
    Set myTable = CurrentDb.CreateTableDef(tablename) 
    myTable.Fields.Append myTable.CreateField("col1", dbText) 
    myTable.Fields.Append myTable.CreateField("col2", dbText) 
    myTable.Fields.Append myTable.CreateField("col3", dbText) 
    myTable.Fields.Append myTable.CreateField("col4", dbDate) 
    myTable.Fields.Append myTable.CreateField("col5", dbText) 
    CurrentDb.TableDefs.Append myTable 
    Application.RefreshDatabaseWindow 
    ''''CREATE TABLE END'''' 

    JSONImport path + myfile, tablename 
End Sub 

Public Sub JSONImport(ByVal path_file As String, ByVal tablename As String) 
    Dim db As Database, qdef As QueryDef 
    Dim FileNum As Integer 
    Dim DataLine As String, jsonStr As String, strSQL As String 
    Dim element As Variant 
    Set db = CurrentDb 
    ' READ FROM EXTERNAL FILE 
    FileNum = FreeFile() 
    Open path_file For Input As #FileNum 
    ' PARSE FILE STRING 
    jsonStr = "" 
    While Not EOF(FileNum) 
     Line Input #FileNum, DataLine 
     jsonStr = jsonStr & DataLine & vbNewLine 
    Wend 
    Close #FileNum 
    Dim p As Object 
    Set p = JSonConverter.ParseJson(jsonStr) 
    ' ITERATE THROUGH DATA ROWS, APPENDING TO TABLE 
    For Each element In p 
     strSQL = "PARAMETERS [col1] Text(255), [col2] Text(255), [col3] Text(255), [col4] Date, [col5] Text(255); " _ 
       & "INSERT INTO " & tablename & "(col1, col2, col3, col4, col5) VALUES ([col1], [col2], [col3], [col4], [col5]);" 

     Set qdef = db.CreateQueryDef("", strSQL) 
     qdef!col1 = element("fullname") 
     qdef!col2 = element("id") 
     qdef!col3 = element("text") 
     qdef!col4 = CDate(Replace(element("timestamp"), "T", " ")) 
     qdef!col5 = element("user") 
     qdef.Execute 
    Next element 

    'Rename Fields 
    Dim fld As DAO.Field 
    Dim tdf As DAO.TableDef 
    Set tdf = db.TableDefs(tablename) 
    Set fld = tdf.Fields("col1") 
    fld.Name = "fullname" 
    Set fld = tdf.Fields("col2") 
    fld.Name = "id" 
    Set fld = tdf.Fields("col3") 
    fld.Name = "text" 
    Set fld = tdf.Fields("col4") 
    fld.Name = "timestamp" 
    Set fld = tdf.Fields("col5") 
    fld.Name = "user" 
    db.Close  
    Set db = Nothing 
    Set fld = Nothing 
    Set tdf = Nothing 
    Set element = Nothing 
    Set p = Nothing 
    Set qdf = Nothing 
End Sub 

Meine JSON Struktur:

{ 
     "fullname": "Henry Timor", 
     "id": "141217245735560741", 
     "text": "How must it feel to know you have lost.", 
     "timestamp": "2015-07-22T05:45:06", 
     "user": "henry_t" 
    }