2015-05-28 2 views
5

У моей компании есть поставщик, предоставляющий поток данных JSON, который мне нужно загружать в нашу базу данных MS Access каждые два часа. Мне нужно:Разбор JSON-канала автоматически в MS Access

  1. загрузки данных из корма,
  2. разобрать JSON в удобный формат для доступа, а затем
  3. вставить его в базу данных.

Я столкнулся с проблемой this question, обсуждая аналогичную проблему, но там нет хорошего описания того, как реализовать это в MS Access. Любая помощь с благодарностью оценили!

+0

Вы также можете просмотреть модули JSON здесь: https://github.com/CactusData/VBA.CVRAPI ... с использованием коллекций для хранения данных. Это немного, но VBA и JSON не созданы друг для друга - простых и умных решений нет. – Gustav

+0

Не могли бы вы поделиться примером JSON, как у вас, и получить таблицу (ы) DB, которую вы хотите получить в результате? Рассмотрим [этот метод] (http://stackoverflow.com/a/30494373/2165759) также. – omegastripes

+0

Ваш вопрос подразумевает, что вам не удобно с VBA, я ошибаюсь в этом? –

ответ

6

Используя библиотеку VBA JSON, вы, безусловно, можете импортировать файлы в формате JSON в MS Access. Идея состоит в том, чтобы рассматривать данные JSON как набор словарей, а Visual Basic предоставляет collection и dictionary в качестве структур данных.

Ниже шаги:

  1. построить таблицу, чтобы соответствовать структуре ожидаемых данных JSON
  2. На VBA IDE стороны MS Access, импортировать JsonConverter.bas (от указанного выше ссылки) в новый модуль
  3. Еще в IDE, в меню Сервис/Ссылки, отметьте VBA Reference: Microsoft Scripting время выполнения
  4. Включить следующий код, который считывает J SON текстовый файл, анализирует его как набор словарей (с ключами и valeus) и добавляет значения итеративно в таблицу Access. Поместите код позади формы доступа или модуля (пример использует файл JSON на один вложенный уровень)

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

Глупый вопрос ... как вы используете эту библиотеку? – Hill

+1

Как «Readme» говорит: Импортируйте JsonConverter.bas в свой проект (Open VBA Editor, Alt + F11; File> Import File); Добавить словарь/класс (укажите ссылку на «Время выполнения сценариев Microsoft») –

-2

Json обработки в MS файл Доступ легко. Просто переименовать расширение .json в .txt и использовать функцию импортатекст с разделителем, установленным в (:) и разделитель текста в ("). Одна строка кода ... Happy кодирования!

+1

Добро пожаловать в Stack Overflow! Хотя это может быть ценным советом для решения проблемы, хороший ответ также демонстрирует решение. Пожалуйста, [править], чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы подумайте о том, чтобы вместо этого писать это как комментарий. –

+0

Этот ответ предполагает, что данные представляют собой плоский файл, и поэтому синтаксический анализ не требуется. Точка JSON - это структурированные данные. Так что этот ответ бесполезен. – Smandoli

0

I мне не разрешено комментировать, но это скорее небольшое предложение для решения Parfait выше. У меня возникли проблемы с выполнением кода, потому что Jsonconverter отсутствовал. Если вы выполните шаги Parfait, убедитесь, что вы также включили JsonConverter в качестве модуля в Access VBA. Вы можете найти этот модуль в файле Excel при условии от VBA-JSON

Выполните следующие действия, чтобы установить VBA-JSON под Access:.

  • Загрузить Specs.bas в качестве модуля (импорт ..)
  • Открыть Excel, нажмите Alt + F11, откройте модуль JSONConverter, Скопировать все (STRG + A, STRG + C)
  • OpenACCESS, нажмите Alt + F11, создать новый модуль, назовите его JsonConverter, Вставить весь код (STRG + V)
  • Reference Microsoft Scripting выполнения

В вашем коде, если ParseJson не найден, используйте эту ссылку:

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

Это мой полный код:

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 

Моя структура JSON:

{ 
     "fullname": "Henry Timor", 
     "id": "141217245735560741", 
     "text": "How must it feel to know you have lost.", 
     "timestamp": "2015-07-22T05:45:06", 
     "user": "henry_t" 
    } 
Смежные вопросы