2012-07-20 153 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)