2017-04-21 94 views
3

我想用.sql文件中的十进制等价替换所有的十六进制。在文件中替换十进制的所有十六进制

我行成千上万的像这样的:

INSERT INTO TEST (TEST_ID, VEHICLE_ID, TEST_TYPE_ID, TYPE_ID, NUM_TEST, TEST_DATE, HOUR_START, HOUR_END, ....) VALUES (844, 504, 3, 1, 3, CAST(0x0000991400000000 AS DateTime), CAST(0x00009914008FC76C AS DateTime), CAST(0x0000991400906924 AS DateTime), ......); 

而且我想用这个SQL文件来创建一个SQLite数据库。但SQLite无法识别十六进制。所以目标是替换文件的所有十六进制。

我发现这个解决方案来替换特定的十六进制:

decimal = int("0x0000991400000000", 0) 

而且我发现这个解决方案由另一人替换单词的所有出现:

for line in fileinput.input(): 
line = re.sub('wordToReplace','newWord', line.rstrip()) 

我试图用第一个在第二个,但'newWord'正在执行一个字符串,我给出一个int。有什么办法可以做我想做的事?

谢谢你的时间!

+0

'str(int)'将stringfy整数。 – Dashadower

+0

文件有多大? – wwii

+0

该文件超过477 MB,有近300 000行“INSERT TO ...”,每行有6个CAST(十六进制)。 – LaPalme

回答

3

使用替换功能与正则表达式:

import re 

data = "INSERT INTO TEST (TEST_ID, VEHICLE_ID, TEST_TYPE_ID, TYPE_ID, NUM_TEST, TEST_DATE, HOUR_START, HOUR_END, ....) VALUES (844, 504, 3, 1, 3, CAST(0x0000991400000000 AS DateTime), CAST(0x00009914008FC76C AS DateTime), CAST(0x0000991400906924 AS DateTime), ......);" 

data_dec = re.sub("(0x[\dA-F]+)",lambda m : str(int(m.group(1),16)),data) 

print(data_dec) 

结果:

INSERT INTO TEST (TEST_ID, VEHICLE_ID, TEST_TYPE_ID, TYPE_ID, NUM_TEST, TEST_DATE, HOUR_START, HOUR_END, ....) VALUES (844, 504, 3, 1, 3, CAST(168311178395648 AS DateTime), CAST(168311187818348 AS DateTime), CAST(168311187859748 AS DateTime), ......); 

当十六进制数的正则表达式("(0x[\dA-F]+)")被找到时,lambda被称为与匹配作为参数。取第一个&组,将其解析为base-16整数,然后将其转换回字符串。

+0

Merci beaucoup让 - 弗朗索瓦。是否有可能使用文件example.sql作为数据而不是字符串,因此直接修改文件?我尝试使用myFile = raw_input(example.sql),然后data = open(myFile,“r”)来做到这一点。我有什么问题。 – LaPalme

+0

你的意思是'data = open(myFile,“r”)。read()'否则你得到句柄,而不是内容。 –

+0

好吧,我知道了!非常感谢,这是我想要的结果。并解释代码如何工作。完美,周末愉快! – LaPalme