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]