Построить дерево зависимостей из csv файла

Рейтинг: 0Ответов: 1Опубликовано: 01.05.2023

Есть следующего формата csv файл:

parent,child,count,lines
root,log_info,1,15
root,log,1,154
root,log_format_msg,1,86
log_info,log,2,154
log,log_format_msg,1,86

Как построить примерно такое дерево?

root
  |
  |--- log_info [count=1, lines=15]
  |       |
  |       |--- log [count=2, lines=154]
  |             |
  |             |--- log_format_msg [count=1, lines=86]
  |
  |--- log [count=2, lines=154]
  |     |
  |     |--- log_format_msg [count=1, lines=86]
  |
  |--- log_format_msg [count=1, lines=86]

Некоторые библиотеки просто воспринимают узлы (такие как root/log и log_info/log) как дубли. Может файл должен быть другого формата?

Ответы

▲ 4Принят

Зачем тратить время на библиотеки если можно самим накидать простенькое решение:

import csv


def build_tree(data, parent):
    tree = {}
    for item in data:
        if item['parent'] == parent:
            child = item['child']
            tree[child] = {'count': item['count'], 'lines': item['lines']}
            subtree = build_tree(data, child)
            if subtree:
                tree[child]['subtree'] = subtree
    return tree


def print_tree(tree, indent=0):
    if indent == 0:
        print('root')
    for key, value in tree.items():
        print(f'|{"      " * indent}{"|" if indent > 0 else ""}')
        print(f'|{"      " * indent}{"|" if indent > 0 else ""}--- {key} [count={value["count"]}, lines={value["lines"]}]')
        if value.get('subtree'):
            print_tree(value['subtree'], indent + 1)


with open('test.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    data = [row for row in reader]

tree = build_tree(data, 'root')
print_tree(tree)

Результат:

root
|
|--- log_info [count=1, lines=15]
|      |
|      |--- log [count=2, lines=154]
|            |
|            |--- log_format_msg [count=1, lines=86]
|
|--- log [count=1, lines=154]
|      |
|      |--- log_format_msg [count=1, lines=86]
|
|--- log_format_msg [count=1, lines=86]