@sazhyk

Как разобрать такую таблицу Excel в Python?

Есть такая табличка в экселе
Табличка
5c66b2f5f1d49528253330.png
Её необходимо перенести в базу на Postgresql с помощью python'а. Но выглядеть она должна так
Что должно получиться
5c66b36bdd07d831498738.png

Чем конкретно парсить файл экселя не имеет особого значения, в этом вопрос не стоит. Вопрос в том, как мне для одинаковых значений поля USER создать новые поля NUMBER-CODE? Вопрос конкретно на алгоритм кода.
Например, я получил эти данные в csv
CSV
CODE,USER,NUMBER
AA01,U01,1375
AA02,U01,71
AA01,U02,957
AA02,U02,815
AA03,U02,65
AA01,U03,1189
AA02,U03,78
AA01,U04,1320
AA02,U04,80
AA01,U05,1100
AA02,U05,516
AA03,U05,61
Какими циклами с условиями я должен это дело обойти?
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
@Hanharr
Возможно наведет на мысли. Меня только смущает, что у вас отсутствует в таблице AA03 для U01, а вы его хотите получить пустым. По идее можно насильно добавлять через условия.

#!/usr/bin/env python3

import csv
import json

table_file = '/home/ratkin.roman/Документы/test.csv'
new_table = {}

with open(table_file, 'r', encoding='utf-8') as table:
    f = csv.reader(table, delimiter=',')
    next(f)
    for row in f:
        new_table.setdefault(row[1], {}).update([(row[0],row[2])])


print(json.dumps(new_table, sort_keys=True, indent=4))


Результат
{
    "U01": {
        "AA01": "1375",
        "AA02": "71"
    },
    "U02": {
        "AA01": "957",
        "AA02": "815",
        "AA03": "65"
    },
    "U03": {
        "AA01": "1189",
        "AA02": "78"
    },
    "U04": {
        "AA01": "132",
        "AA02": "80"
    },
    "U05": {
        "AA01": "1100",
        "AA02": "516",
        "AA03": "64"
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Ну можно тогда так:
from itertools import groupby

source = [
    {'code': 'AA01', 'group': 'U01', 'user': '1375', },
    {'code': 'AA01', 'group': 'U01', 'user': '1575', },
    {'code': 'AA03', 'group': 'U02', 'user': '1375', },
    {'code': 'AA02', 'group': 'U02', 'user': '1345', },
    {'code': 'AA02', 'group': 'U03', 'user': '1315', },
    {'code': 'AA01', 'group': 'U04', 'user': '1615', },

]

 result = {k:list(v) for k,v in groupby(source, lambda x: x['group'])}
>>> print(result)
{'U01': [{'code': 'AA01', 'group': 'U01', 'user': '1375'}, {'code': 'AA01', 'group': 'U01', 'user': '1575'}], 'U02': [{'code': 'AA03', 'group': 'U02', 'user': '1375'}, {'code': 'AA02', 'group': 'U02', 'user': '1345'}], 'U03': [{'code': 'AA02', 'group': 'U03', 'user': '1315'}], 'U04': [{'code': 'AA01', 'group': 'U04', 'user': '1615'}]}
>>> result = {k:{row['user']: row['code'] for row in v} for k,v in groupby(source, lambda x: x['group'])}
>>> result
{'U01': {'1375': 'AA01', '1575': 'AA01'}, 'U02': {'1375': 'AA03', '1345': 'AA02'}, 'U03': {'1315': 'AA02'}, 'U04': {'1615': 'AA01'}}
>>>
Ответ написан
ScriptKiddo
@ScriptKiddo
Попробуйте погуглить про itertools.groupby

from itertools import groupby

source = [
    {'code': 'AA01', 'group': 'U01', 'user': '1375', },
    {'code': 'AA01', 'group': 'U01', 'user': '1575', },
    {'code': 'AA03', 'group': 'U02', 'user': '1375', },
    {'code': 'AA02', 'group': 'U02', 'user': '1345', },
    {'code': 'AA02', 'group': 'U03', 'user': '1315', },
    {'code': 'AA01', 'group': 'U04', 'user': '1615', },

]

result = {}
for key, group in groupby(source, lambda x: x['group']):
    subgroup = {}
    for item in group:
        subgroup[item['code']] = item['user']
    result[key] = subgroup


Output

{
    'U01': {'AA01': '1575'},
    'U02': {'AA03': '1375',
            'AA02': '1345'}, 
    'U03': {'AA02': '1315'}, 
    'U04': {'AA01': '1615'}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы