我想在.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())
我尝试使用第二个中的第一个,但是新的'正在考虑一个字符串,我给了一个int。什么可以做我想要的方式?
感谢您的时间!
答案 0 :(得分: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
。拿第一个&只有group,将其解析为base-16整数,然后将其转换回string。