2017-04-21 93 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