2012-07-20 156 views
1

我有一個爲cobol編寫的舊的informix數據庫。所有的字段都在代碼中,所以我的SQL查詢看起來像。Python在文本文件中替換定義中的單詞

SELECT uu00012 FROM uu0001; 

這很難讀。

我有一個字段定義一樣

uu00012 client 
uu00013 date 
uu00014 f_name 
uu00015 l_name 

我想換出了代號爲更多的英語名稱的文本文件。在其上運行一個python腳本,並保存一個英文名稱的文件。

這樣做的最好方法是什麼?

+0

你就不能創建另一個數據庫,並與舊值填滿它? – 2012-07-20 20:34:33

+0

是的,一個查找表解決方案將爲此工作以及...許多可能性:) – 2012-07-20 20:43:29

回答

1

如果每一塊絕對是一個單獨的詞,re.sub肯定是去這裏的路:

#create a mapping of old vars to new vars. 
with open('definitions') as f: 
    d = dict([x.split() for x in f]) 

def my_replace(match): 
    #if the match is in the dictionary, replace it, otherwise, return the match unchanged. 
    return d.get(match.group(), match.group()) 

with open('inquiry') as f: 
    for line in f: 
     print re.sub(r'\w+', my_replace, line) 
+0

效率通常不是這些事情的一個因素。可讀性是,但我發現它嚴重缺乏: – orlp 2012-07-20 20:35:12

+0

我認爲這仍然太複雜了。Python強調簡單易讀的代碼,利用內置類型和他們的方法。這可以是一個簡單的字典或列表人口 – 2012-07-20 20:39:38

+0

@nightcracker - 評論有幫助嗎? – mgilson 2012-07-20 20:42:29

0

概念,

我可能會先建值編碼的映射 - >英語(在內存或o。

然後,在你的地圖每個編碼,掃描文件,並用代碼映射相當於英語取代。

0
infile = open('filename.txt','r') 
namelist = [] 
for each in infile.readlines(): 
    namelist.append((each.split(' ')[0],each.split(' ')[1])) 

這會給你鑰匙的列表,值對

我不知道你想不過,你需要更明確的

0
dictionary = '''uu00012 client 
uu00013 date 
uu00014 f_name 
uu00015 l_name''' 

dictionary = dict(map(lambda x: (x[1], x[0]), [x.split() for x in dictionary.split('\n')])) 

def process_sql(sql, d): 
    for k, v in d.items(): 
     sql = sql.replace(k, v) 
    return sql 

sql = process_sql('SELECT f_name FROM client;', dictionary) 

構建dictionary與有結果的事:

{'date': 'uu00013', 'l_name': 'uu00015', 'f_name': 'uu00014', 'client': 'uu00012'} 

然後運行你的SQL並用編碼的東西代替人類可讀的值。其結果是:

SELECT uu00014 FROM uu00012; 
0
import re 

f = open("dictfile.txt") 

d = {} 
for mapping in f.readlines(): 
    l, r = mapping.split(" ") 
    d[re.compile(l)] = r.strip("\n") 

sql = open("orig.sql") 
out = file("translated.sql", "w") 

for line in sql.readlines(): 
    for r in d.keys(): 
     line = r.sub(d[r], line) 
    out.write(line)