Извлечь строковое значение ключа в другой ключ / значение во вложенном json и вставить в sql дБ - PullRequest
0 голосов
/ 23 марта 2020

Извлечение данных из вложенного файла json и вставка в sql дБ. Из ключевых деталей я хочу получить информацию ниже и вставить в sql дБ;

образец json данных файла и ключ / значение следующим образом

{
  "response": {
   "client_log": {
      "data": [
        {
          "city": "LONDON",
          "login": "AAAAAAAAAAAAAA",
          "state": "MC",
          "details": "Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user1@gmail.com\r\nServ Id: 1101ar12\r\nServ Num: 11111\r\nServ Details: Super-A\r\nState: LONDON\r\nCity: LONDON\r\n\r\n------Service Information------\r\n\r\nUser Name: John Clark\r\nMobile Number: 000111222\r\n\r\n------Reported Form------\r\n\r\nForm-1: zzzzz\r\nType: 111\r\n\r\nRemarks: Remarks 123.",
          "log_number": "1",
          "department": "Sales",
          "staff_id": "S123",
          "staff_name": "EricY",
          "timestamp": "2020-02-27 15:57:24"
        },
        {
          "city": "SINGAPORE",
          "login": "BBBBBBBBBBBBB",
          "state": "XX",
          "details": "Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user2@gmail.com\r\nServ Id: 903oa112\r\nServ Num: 12345\r\nServ Details: Super-B\r\nState: Sydney\r\nCity: Sydney\r\n\r\n------Service Information------\r\n\r\nUser Name: Peter\r\nMobile Number: 333444555\r\n\r\n------Reported Form------\r\n\r\nForm-2: xxxxxxxxxx\r\nType: 111\r\n\r\nRemarks: Remarks 890.",
          "log_number": "1",
          "department": "Eng",
          "staff_id": "S456",
          "staff_name": "YongG",
          "timestamp": "2020-02-27 15:57:24"
        }
      ],
      "query": "13"
    },
    "response_time": "0.723494",
    "transaction_id": "909122",
    "transaction_status": "OK",

  }
}

Это фрагмент кода, который я использую для извлечения данных и вставки в sql

myfile = 'sample.json'

with open(myfile, 'r') as f:
   mydata = json.load(f)


sql = "INSERT INTO `table1` (`city`, `login`, `state`, `details`, `log_number`, `department`, `staff_id`, `staff_name`, `timestamp`) VALUES ( %(city)s, %(login)s, %(state)s, %(details)s, %(log_number)s, %(department)s, %(staff_id)s, %(staff_name)s, %(timestamp)s )"
cursor.executemany( sql, mydata['response']['client_log']['data'])

db.commit()
db.close()

из приведенного выше кода. Я могу получить ключевые данные с учетом данных, но полученное значение данных представлено и вставлено в sql в 1 больших данных чанка (подробности столбца sql) ... Спасибо.

1 Ответ

1 голос
/ 23 марта 2020

Вы можете легко проанализировать str, связанный с клавишей details, используя методы split() и / или find(). Go построчно, и предположим, что все слева от : является ключом, а все справа - значением.

Например:

import json

myfile = 'sample.json'

with open(myfile, 'r') as f:
   mydata = json.load(f)

for entry in mydata['response']['client_log']['data']:
    parsed_details = {}
    for line in entry['details'].split('\r\n'):
        split = line.find(': ') # find() returns -1 if no match is found
        if split != -1:
            key = line[:split]
            value = line[split+2:] # 2 = len(': ')
            parsed_details[key] = value
    entry['parsed_details'] = parsed_details

или

import json

myfile = 'sample.json'

with open(myfile, 'r') as f:
   mydata = json.load(f)

for entry in mydata['response']['client_log']['data']:
    parsed_details = {}
    for line in entry['details'].split('\r\n'):
        try:
            key, value = line.split(': ', maxsplit=1)
            parsed_details[key] = value
        except ValueError:
            # This error is only thrown when the line doesn't have ': ' in it, 
            # which means there aren't enough values to unpack. It is safe to pass.
            pass
    entry['parsed_details'] = parsed_details

dict, который является каждым элементом mydata['response']['client_log']['data'] list, теперь имеет ключ parsed_details, значение которого равно dict с парами ключей и значений, извлеченными из details ключ, как вы можете видеть в этом выводе:

mydata
Out[2]: 
{'response': {'client_log': {'data': [{'city': 'LONDON',
     'login': 'AAAAAAAAAAAAAA',
     'state': 'MC',
     'details': 'Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user1@gmail.com\r\nServ Id: 1101ar12\r\nServ Num: 11111\r\nServ Details: Super-A\r\nState: LONDON\r\nCity: LONDON\r\n\r\n------Service Information------\r\n\r\nUser Name: John Clark\r\nMobile Number: 000111222\r\n\r\n------Reported Form------\r\n\r\nForm-1: zzzzz\r\nType: 111\r\n\r\nRemarks: Remarks 123.',
     'log_number': '1',
     'department': 'Sales',
     'staff_id': 'S123',
     'staff_name': 'EricY',
     'timestamp': '2020-02-27 15:57:24',
     'parsed_details': {'Email Id': 'user1@gmail.com',
      'Serv Id': '1101ar12',
      'Serv Num': '11111',
      'Serv Details': 'Super-A',
      'State': 'LONDON',
      'City': 'LONDON',
      'User Name': 'John Clark',
      'Mobile Number': '000111222',
      'Form-1': 'zzzzz',
      'Type': '111',
      'Remarks': 'Remarks 123.'}},
    {'city': 'SINGAPORE',
     'login': 'BBBBBBBBBBBBB',
     'state': 'XX',
     'details': 'Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user2@gmail.com\r\nServ Id: 903oa112\r\nServ Num: 12345\r\nServ Details: Super-B\r\nState: Sydney\r\nCity: Sydney\r\n\r\n------Service Information------\r\n\r\nUser Name: Peter\r\nMobile Number: 333444555\r\n\r\n------Reported Form------\r\n\r\nForm-2: xxxxxxxxxx\r\nType: 111\r\n\r\nRemarks: Remarks 890.',
     'log_number': '1',
     'department': 'Eng',
     'staff_id': 'S456',
     'staff_name': 'YongG',
     'timestamp': '2020-02-27 15:57:24',
     'parsed_details': {'Email Id': 'user2@gmail.com',
      'Serv Id': '903oa112',
      'Serv Num': '12345',
      'Serv Details': 'Super-B',
      'State': 'Sydney',
      'City': 'Sydney',
      'User Name': 'Peter',
      'Mobile Number': '333444555',
      'Form-2': 'xxxxxxxxxx',
      'Type': '111',
      'Remarks': 'Remarks 890.'}}],
   'query': '13'},
  'response_time': '0.723494',
  'transaction_id': '909122',
  'transaction_status': 'OK'}}

Я не очень знаком с SQL, поэтому я не могу помочь вам с вашим последним шагом по обновлению вашей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...