Построить дерево зависимостей из csv файла
Есть следующего формата 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) как дубли. Может файл должен быть другого формата?
Ответы (1 шт):
Автор решения: kristal
→ Ссылка
Зачем тратить время на библиотеки если можно самим накидать простенькое решение:
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]