mysql导入超大csv指南
需求描述
手头下载了一个比较大(400Mb+)的语料数据,需要从里面提取出某两种语言的句子对,因为数据特别大,且csv并非标准以逗号分隔而是以tab分隔,尝试用Navicat的导入向导导入失败。
另外以后也可能会有处理超大csv的场景,mark一下方法备用。
失败方法
一开始打算直接用Navicat进行导入,尝试了一下输入向导。这里一个坑点:如果你选择csv格式,字段分隔符是不可选的,如下图。
这时候可以在上一步就选择文本txt,然后就可以自定义分隔符了,如下图。
虽然但是这里也没有tab(\t)的选项,其他那里莫名其妙只能输入一个字符,所以也输入不了\t,尝试直接下一步会一直卡住,虽然没有显示无响应但是一直在处理中,等了半个小时也不管用,所以这个方法不行。
正确食用方法
实验环境:mysql 8.0 @ win10
使用Navicat进行操作
实际上mysql是可以直接读csv文件来进行导入的,方法也超级简单。
首先需要放开允许本地导入文件
SET GLOBAL local_infile = 'ON';
看到下面执行结果为OK就可以了,然后进行导入。
LOAD DATA LOCAL INFILE 'PATH_TO_CSV_FILE' INTO TABLE TABLE_NAME FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'(FIELD1, FIELD2, ...);
填入csv的路径和表名,然后TERMINATED BY就是分隔符,后面LINE TERMINATED BY是每行结束的标志,一般来说是换行符\n,后面field就是数据库中指定的字段。运行以后,需要等待一段时间,这个时间取决于数据库io速度了。我这里做了一次清空表再做导入,可能IO比较忙,用了快三分钟,第一次导入的时候只用了78秒,速度还是蛮快的。另外这里也可以看到数据量蛮大的,一共800w+条。
其他处理超大csv的经验
如果需要打开一个超大的csv,千万不要用记事本(Notepad)打开,百分百卡死。
如果只需要进行文本编辑,可以使用vscode,打开很快,保存也比较快,但不方便进行简单编辑以外其他操作。其次使用pycharm自带的文本编辑器也能够比较快地打开超大的csv。也有推荐说用UltraEdit之类的打开的,因为vscode现有,不再测试。
可以使用Excel的从csv导入的功能(在数据-从文本/csv),另外也可以选择文件编码(如utf-8)和分隔符,他也能够自动检测(不太好用)。预览一下没问题点加载即可。但是excel有行数限制(大概),反正这份超大的语料我就无法加载。
另外如果使用excel直接打开utf-8编码的csv会出现乱码,因为win的默认编码是gbk(目前可以把win的全局编码设置成utf-8,该设置在地区与语言里,但是开启后不支持utf-8编码的软件可能会出现文件夹乱码、软件界面乱码等奇怪的情况,还是不能开启)。同时也无法识别逗号以外分隔符的csv。因此必须用导入的方法打开。