SQL結果をツリーを表示
RDBMS でツリーを表すこんなデータを AA でツリー表示するスクリプトを書いてみた。
1 11 12 11 21 22 21 23 22 41 51 52 51 80 81 80 82 81 83 82 99999
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys class Node: def __init__(self, value="", parentkey=""): self.value = value self.parentkey = parentkey self.children = [] self.parent = None def show(self, level): if self.value != "": print " " * level + self.value for x in self.children: x.show(level+1) def parse(lines): a = [l.split() for l in lines] nodes = {"" : Node("", None)} for x in a: if len(x) == 2: nodes[x[0]] = Node(x[0], x[1]) elif len(x) == 1: nodes[x[0]] = Node(x[0], "") for n in nodes: if nodes[n].parentkey != None: p = nodes[nodes[n].parentkey] nodes[n].parent = p p.children.append(nodes[n]) return nodes[""] if __name__ == '__main__': tree = parse(sys.stdin.readlines()) tree.show(0)
実行例:
$ ./sql2tree.py < hoge.txt|indent2tree +-11 | +-12 +-21 | +-22 | +-23 +-99999 +-51 | +-52 +-41 +-1 +-80 +-81 +-82 +-83
関連:
indent2tree - メモ帳
http://d.hatena.ne.jp/parasporospa/20071209/p2
その逆:
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys def getlevel(s): return len(s) - len(s.lstrip()) if __name__ == '__main__': lines = sys.stdin.readlines() currentlevel = -1 parenthash = { -1 : "" } for i in range(len(lines)): level = getlevel(lines[i]) value = lines[i].strip() parenthash[level] = value currentlevel = level print value, parenthash[level-1]