将文件中的所有十六进制替换为十进制

LaP*_*lme 4 python search hex replace

我想用 .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), ......);
Run Code Online (Sandbox Code Playgroud)

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

我找到了这个解决方案来替换特定的十六进制:

decimal = int("0x0000991400000000", 0)
Run Code Online (Sandbox Code Playgroud)

我发现这个解决方案可以用另一个单词替换所有出现的单词:

for line in fileinput.input():
line = re.sub('wordToReplace','newWord', line.rstrip())
Run Code Online (Sandbox Code Playgroud)

我尝试在第二个中使用第一个,但“newWord”需要一个字符串,而我给出一个 int。有什么办法可以做我想做的事?

感谢您的时间 !

Jea*_*bre 6

使用正则表达式的替换函数:

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)
Run Code Online (Sandbox Code Playgroud)

结果:

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), ......);
Run Code Online (Sandbox Code Playgroud)

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