Разбор поля в MS Access с данными CSV (JSON) - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть файл данных CSV, который я загружаю в MS Access. Нет проблем с этим. У меня все это загружено.

Моя проблема заключается в том, что одна из записей в файле содержит поле, содержащее данные CSV (JSON данные), которые являются данными счета-фактуры отдельной позиции (ProductData), и может содержать до 25 позиций.

Я пытаюсь разобрать это поле на несколько записей в другой таблице, все связаны числом после «500», которое является номером транзакции.

У кого-нибудь есть идеи о том, как сделать это в Microsoft Access, ПОЖАЛУЙСТА?

Образцы данных:

500,3,30600052763,30128903358,"{""type"": ""reportingData"", ""merStoreId"": ""8135001"", ""productData"": [{""productCode"": ""001"", ""totalAmount"": ""20.00"", ""quantity"": ""16.000"", ""unitPrice"": ""1.25"", ""tax1Amount"": ""6.22""}, {""productCode"": ""102"", ""totalAmount"": ""14.00"", ""quantity"": ""1.000"", ""unitPrice"": ""14.00""}, {""productCode"": ""963"", ""totalAmount"": ""1.00"", ""quantity"": ""1.000"", ""unitPrice"": ""1.00"", ""tax1Amount"": ""0.00""}]}"

Я приложил образец того, как бы я хотел, чтобы таблица выглядела на основе транзакции № 3 выше :

Tbl500                                      
Transaction Number  Second Field    Third Field Type            MerStoreID  ProductCode TotalAmount Quantity    UnitPrice   Tax1Amount  Tax2Amount
3                   30600052763     0128903358  reportingData   8135001     001         20.00       16.000      1.25        6.22    
3                   30600052763     30128903358 reportingData   8135001     102         14.00       1.000       14.00       
3                   30600052763     30128903358 reportingData   8135001     963         1.00        1.000       1.00        0.00    

1 Ответ

1 голос
/ 04 апреля 2020

Ниже приведен код, который берет текстовый файл, импортирует данные и немного их убирает, а затем разбивает на массив переменной длины. Затем он зацикливает этот массив и добавляет данные в таблицу, используя присутствие «productCode», чтобы определить, является ли это новая запись:

Sub sGetJSONData()
    On Error GoTo E_Handle
    Dim db As DAO.Database
    Dim rsData As DAO.Recordset
    Dim strFile As String
    Dim intFile As Integer
    Dim strInput As String
    Dim astrData() As String
    Dim intLoop1 As Integer
    Set db = DBEngine(0)(0)
    Set rsData = db.OpenRecordset("SELECT * FROM tblJSON WHERE 1=2;")
    strFile = "C:\test\json.txt"
    intFile = FreeFile
    Open strFile For Input As intFile
    Do
        Erase astrData
        Line Input #intFile, strInput
        strInput = Replace(strInput, Chr(34) & Chr(34), "")
        strInput = Replace(strInput, "productData: [{", "")
        strInput = Replace(strInput, "{productCode", "productCode")
        strInput = Left(strInput, Len(strInput) - 4)
        strInput = Replace(strInput, "}", "")
        strInput = Replace(strInput, ", ", ",")
        astrData = Split(strInput, ",")
        With rsData
            .AddNew
            !TransactionNumber = astrData(1)
            !SecondField = astrData(2)
            !ThirdField = astrData(3)
            !Type = Mid(astrData(4), 9)
            !ProductCode = Mid(astrData(6), 13)
            !MerStoreID = Mid(astrData(5), 13)
            For intLoop1 = 7 To UBound(astrData)
                If Left(astrData(intLoop1), 11) = "totalAmount" Then !TotalAmount = Mid(astrData(intLoop1), 14)
                If Left(astrData(intLoop1), 8) = "quantity" Then !Quantity = Mid(astrData(intLoop1), 11)
                If Left(astrData(intLoop1), 9) = "unitPrice" Then !UnitPrice = Mid(astrData(intLoop1), 12)
                If Left(astrData(intLoop1), 10) = "tax1Amount" Then !Tax1Amount = Mid(astrData(intLoop1), 13)
                If Left(astrData(intLoop1), 10) = "tax2Amount" Then !Tax2Amount = Mid(astrData(intLoop1), 13)
                If Left(astrData(intLoop1), 11) = "productCode" Then
                    .Update
                    .AddNew
                    !TransactionNumber = astrData(1)
                    !SecondField = astrData(2)
                    !ThirdField = astrData(3)
                    !Type = Mid(astrData(4), 9)
                    !ProductCode = Mid(astrData(intLoop1), 13)
                    !MerStoreID = Mid(astrData(5), 13)
                End If
            Next intLoop1
            .Update
        End With
    Loop Until EOF(intFile)
sExit:
    On Error Resume Next
    rsData.Close
    Set rsData = Nothing
   Reset
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sGetJSONData", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

С уважением,

...