我从phpmyadmin直接导出包含所有用户数据的.sql文件。 是否可以在不执行文件的情况下从.sql文件中获取所有列名和值的列表?
我目前正在使用python的MySQLdb库来执行.sql文件并创建以下内容而不会有麻烦,但我试图跳过执行部分并直接转换为.txt文件
示例:
输入文件内容
CREATE TABLE IF NOT EXISTS `login_logs` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Username` varchar(20) NOT NULL,
`Time` int(11) NOT NULL,
`IP` varchar(20) NOT NULL,
`Type` enum('Success','Failed') NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
INSERT INTO `login_logs` (`ID`, `Username`, `Time`, `IP`, `Type`) VALUES
(1, 'User1', 1411318511, '127.0.0.1', 'Failed'),
(2, 'User2', 1411318674, '127.0.0.1', 'Failed'),
(3, 'User3', 1411318683, '127.0.0.1', 'Success'),
(4, 'User12', 1411319092, '127.0.0.1', 'Success'),
(5, 'User3', 1411319112, '127.0.0.1', 'Success');
输出类似于
ID | Username | Time | IP | Type
1 | User1 | 1411318511 | 127.0.0.1 | Failed
1 | User2 | 1411318674 | 127.0.0.1 | Failed
稍后将保存在文本文件中。
答案 0 :(得分:2)
我了解到你想要从sql文件中提取列名和值,并将它们写为txt文件,并将管道作为列分隔符。 下面的代码应该完成这项工作。但是,它完全针对您的输入文件示例进行了定制,尤其是INSERT INTO部分中的文本结构。一旦改变(例如,在插入' INSERT INTO'之后的新行),它就无法工作。
H个
#!/usr/bin/python
def remove_stuff(inp_string):
""" removes some punctuation marks"""
pm = ['(', ')', '\'', ';', '`']
# explicitly remove '),' from values lines
out_string = inp_string.replace('),','')
for pmark in pm:
out_string = out_string.replace(pmark, '')
return out_string
f = open('sql_statements.sql','r')
out = open('table2.txt','w')
line = f.readline()
vals = 0
while line != '':
if vals == 1:
values = line.strip()
values = remove_stuff(values)
values = values.split(',')
values = '|'.join(values)
out.write(values + '\n')
if 'INSERT INTO' in line.upper():
col_names = line.split('(')[1]
col_names = col_names.split(')')[0]
col_names = remove_stuff(col_names)
col_names = col_names.split(',')
col_names = '|'.join(col_names)
out.write(col_names + '\n')
vals = 1
line = f.readline()
f.close()
out.close()
答案 1 :(得分:1)
试试这个。
import re
s = open('data.sql','r').read()
s = s[s.find('INSERT'):]
c = re.compile('\((.+),(.+),(.+),(.+),(.+)\)')
f = open('out.txt', 'w')
for item in c.findall(s):
item = [a.replace("'", "").replace("`","") for a in item]
f.write('\t|\t'.join(item)+'\n')
f.close()
我正在使用正则表达式来匹配模式