如题,比如说有一些txt字段,想到导入数据库方便查找分类的话
utf-8就够了,只不过需要在代码里遇到错误处理下,比如跳过什么的
cmd cat 合并文件, sort去重
^(.?)\s(.?)$ 匹配空格间隔行
导入前最好分割下文件,导入几个表中,
目的是为了方便做索引和查找,不然会很卡。
split -a 2 -d -b 1G all-s-u.txt child
其实navicat右键导入向导就可以了,在这之前最好做一个去重,否则插入效率很低(如果加了索引的话)
数据处理
0 合并前先判断文件类型
file *
1 合并当前文件夹所有文件
git bash
cat * > merged-file
2 找出重复的,排序
export LC_ALL='C'
sort r-sort.txt > r-sorted.txt
3 去重
uniq r-sorted.txt > r-sorted-unique.txt
或者直接 sort加去重
sort -u -t ' ' -k1,1 111.txt > 22.txt
去除无用数据
可以去除一些脏数据,加快插入效率
sed -i '/----/d' 111.txt
建表
CREATE TABLE `test_code` (
`id` int(50) NOT NULL AUTO_INCREMENT,
`user` varchar(191) DEFAULT NULL,
`pass` varchar(191) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uername_index` (`user`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
最好不要唯一索引(影响插入速度?),正常B树索引就OK了
注意索引的长度,有191的限制
Python代码
import pymysql
import os
parent_path = "./xxxxxx"
db = pymysql.connect("localhost","root","root","main" )
#定义一个游标,以便获得查询对象。
cu = db.cursor()
def process_one_file(s):
with open(s, 'r', encoding='utf-8', errors='ignore') as f:
for line in f:
# print(line)
try:
data_array = line.split("----")
if(len(data_array) < 2):
continue
user = data_array[0].strip()
password = data_array[1]
t.append((None, user, password))
if(len(t) > 10000):
# print(t)
cu.executemany('replace into table_xxx (id, user, pass) values(%s, %s, %s)', t)
db.commit()
t = []
except:
continue
l = os.listdir(parent_path)
for each_path in l:
# print()
print("============ " + each_path)
process_one_file(parent_path + "/" + each_path)
cu.close() #关闭游标
db.close() #关闭数据库
print("finised!")
input("sss")
注意
先设置mysql的username字段索引,也就是你要查询的字段。
代码是sqlite python的,但是发现sqlite太卡,不方便查询,(sqlite果然只适合做配置文件之类的啊,反正不能超过500M感觉)
需要换成mysql,代码就要换,用pymysql就行,mysql要用myisam,查询快。
图片引用文章并介绍了其他引擎
https://www.cnblogs.com/jepson6669/p/9853241.html
查询的时候不要用 LIKE "%xxxx%"
,慢死你。用这个"xxx%"
因为这个是可以利用索引的。
如图 explain下就看出来了
%xxx% 相当于遍历了整张表
xxx% 则是查询了索引 (B-tree),效率提升了几千倍