多数のSQLファイルからよく使うテーブル名を調べるサンプル

bonlifeです。10月になって、新入社員が来たり、他部署から来た人がいるので、うちの部署でよく使うOracleのテーブルだけでも簡単に説明することになりました。で、過去自分が書いたSQL(SELECTばっかり)を調査して、よく使うテーブルを調べてみることに。そんな時はもちろんPython
スクリプトは殴り書きなので、SELECTにしか対応してなかったり、テーブル名で使える文字を必要以上に厳しくチェックしてたり、フォルダ名やファイル名を固定値で埋め込んでいたりしますが、気にしない方向で。(optparse使う自分用雛形を用意しておいて、修正するようにした方が良い気がしてきました…。)

  • tablename_count.py
# -*- coding: cp932 -*-

import re
import os

table_count_dict = dict()

def prettify_tablename(s):
    tablename = s.strip().split()[0].upper()
    if re.match(r'^[0-9A-Z$_."]+$',tablename):
        if '.' in tablename:
            return tablename.split('.')[1].strip('"')
        else:
            return tablename.strip('"')

def divide_tablename(s):
    return [prettify_tablename(x) for x in s.split(',')]

def count_tablename(f):
    content = open(f).read()
    p = re.finditer(r'from\s(?P<tables>.*?)(\swhere|;|[(])', content, (re.IGNORECASE|re.MULTILINE|re.DOTALL))
    if p:
       for i in p:
           tables = divide_tablename(i.group('tables'))
           for i in tables:
               table_count_dict[i] = table_count_dict.get(i,0) + 1

for root, dirs, files in os.walk(r'C:\test\sql'):
    for i in files:
        count_tablename(os.path.join(root,i))

table_count_list = zip(table_count_dict.keys(),table_count_dict.values())
outfile = open('result.txt','w')
for i in sorted(table_count_list,cmp=lambda x,y: cmp(x[1],y[1]),reverse=True):
    outfile.write("%s\t%s\n" % (i[0], i[1]))

あのあたりでSQLファイルばっかりを集めたフォルダを指定してあげてから、このスクリプトを実行すると、上手くいけば以下のような内容の result.txt が出力されます。

TABLE_D	92
TABLE_A	52
TABLE_C	29
TABLE_B	23

でっていう。
実際には、SQLファイルばっかり集めたフォルダがなかったので、メモを集めたフォルダで実行しました。そしたら、Pythonの from で始めるimport文が引っかかったりして、もう大変!日ごろからのファイル整理が大切ですね…orz