前几天有一个需求,将一个数据库表中查询出的结果集导入到另一个数据库中的某个表里。而提供的结果集里数据的列之间没有分隔符,无法直接将数据导入到数据库。数据类似下面这样:
se User_id User_Pwd User_name
-- -------------------- ------------------ --------------------
01 90123948029348001923 213123144 张三
01 91288401924815122423 31412321312321 李四
02 1982743129048129840 12321412441 王五
数据一共有好几万条,数据的特点是两字段之个间没有分隔符,且字段间的空格数不固定,没办法直接替换空格,可以考虑使用文本编辑器的列模式按照每个字段的长度进行分隔。比如第一个字段长度为2,于是在第二位后加一个分隔符;第二个字段长度为20,于是在第二个字段从左至右移动20位后加一个分隔符,以此类推。
考虑使用文本编辑器的列模式
由于考虑使用列模式,加一次分隔符最多可以在所有记录的两个字段之间加上分隔符。给我的表中有19个字段,最少需要加18次分隔符。而文本编辑器如果一次给好几万条记录加分隔符,需要花费好几分钟时间,期间呈无响应状态。初步估计仅数据加分隔符的处理都需要花费几个小时时间,效率低下。
考虑使用vim列块类型的可视模式
前段时间有幸了解到vim的列块模式,跟文本编辑器的列模式类似。凭感觉是可以用在当前场景下的,于是马上进行实践。通过实践,使用vim的列块模式加分隔符19个字段也只需要几分钟就搞定了,大大节省了时间。vim不可谓之不强!!
vim列块可视模式添加分隔符
为了方便起见,就以上面的数据为例子,传一份到linux上。
1.vim打开数据文件。
2.对数据文件使用列块模式进行编辑。
2.1光标右移,测试文件中第一个字段是将光标右移2个字符。按键:2+右箭头或者2+L。为了操作方便好记我一般都是用的箭头。
光标会移动到第二个字段前的空格位置,如下:
2.2 CTRL+v 进入列块模式
2.3 光标下移,测试文件中是3条记录,下移4位就可以了。按键:4+下箭头。由于已经进入列块模式,以下的四列都会被选中。如下:
2.4 替换。将选中的四列空格替换成需要的分隔符,我这里使用|。按键:r| 。r表示替换的意思。操作后,第一个字段和第二个字段之间的空格都被替换成分隔符|了。如下:
2.5 重复上面的4个步骤即可。需要注意,从第二个字段开始光标应该是往右移字段长度加1个字符,因为一次替换完后,光标的位置是在表头的空格之间需要移到下一个空格就需要加1了。
处理完成后字段之间都加上了分隔符,效果如下:
接下来只需要使用sed将字段中的空格去掉就将数据文件转换成了标准的可以导入到数据库中的文件了。