在做sdb 导入操作时,通过more 查看数据,格式是比较正常的,样例数据如下:
CB20160630968101173208||0160630|73208|2|_*|3903|BZ|B3412|04347||1||09664.8900| |0000|6968|6968|BI968101|BI579101|BI913101|BI579001|BI579101|00|N9|_9|X00|_0|N9||N9|N9||0010101|0010101|||016-06-30 09:47:44|001-01-01 00:00:00||N9|N9||N9|EST|111111|111111|||1||||10110000|05_FIN_EVT_DTL_CB0_A2|B_JBPF10|0160630
但是一旦做数据导入,导入命令如下
/data/sdbadmin/bin/sdbimprt --ignorenull true -j 18 --trim both -e "|" -r " " --type csv -s jushantest02 -p 11810 -c foo -l bar --file /data/testdata/test.txt --fields "COL1 string,COL2 string,COL3 string,COL4 string,COL5 string,COL6 string,COL7 string,COL8 string,COL9 string,COL10 string,COL11 string,COL12 string,COL13 string,COL14 string,COL15 string,COL16 string,COL17 string,COL18 string,COL19 string,COL20 string,COL21 string,COL22 string,COL23 string,COL24 string,COL25 string,COL26 string,COL27 string,COL28 string,COL29 string,COL30 string,COL31 string,COL32 string,COL33 string,COL34 string,COL35 string,COL36 string,COL37 string,COL38 string,COL39 string,COL40 string,COL41 string,COL42 string,COL43 string,COL44 string,COL45 string,COL46 string,COL47 string,COL48 string,COL49 string,COL50 string,COL51 string,COL52 string,COL53 string,COL54 string,COL55 string,COL56 string,COL57 string,COL58 string,COL59 string,COL60 string,COL61 string,COL62 string,COL63 string,COL64 string,COL65 string,COL66 string,COL67 string"
发现导入数据库中的数据格式有问题
db.foo.bar.find()
{ "_id": { "$oid": "57bc0f8a5dbe8e1f31000000" }, "COL1": "CB20160630968101173208", "COL2": "?5", "COL3": "?20160630", "COL4": "?173208", "COL5": "?02", "COL6": "?@_*", ... "COL64": "?CB_JBPF10", "COL65": "?20160630 " }
大家可以发现,每个字段前面都出现了一个"?" 符号,证明这个字段切分符肯定不止"|"符号,并且在记录分割符上,应该是"
",而不是"
"
解决方法,首先通过tail 命令截取少量的样例数据
tail -1 test.txt > test2.txt
然后通过 od 命令将不可见字符打印出来,给大家一个od 的使用例子
echo "A" | tr -d " " | od -An -t dC
65
A 字符对应的ascii 表就是65,所以我们可以通过这个命令来抓取不可见字符
执行
cat test2.txt | tr -d " " | od -An -t dC
打印的结果如下
67 66 50 48 49 48 49 49 50 57 57 57 56 49 48 49 52 57 50 53 53 57 124 27 53 124 27 50 48 49 48 49 49 50 57 124 27 52 57 50 53 53 57 124 27 48 51 124 27 64 95 42 124 27 50 48 49 48 57 124 27 124 27 67 66 87 124 27 67 66 51 55 49 48 124 27 32 124 27 49 56 55 55 56 55 54 51 124 27 48 124 27 48 49 124 27 50 124 27 57 57 55 46 53 48 48 48 124 27 68 124 27 57 57 56 57 57 124 27 57 57 56 57 57 124 27 57 57 56 57 57 124 27 67 66 73 57 57 56 49 48 49 124 27 124 27 67 66 73 48 53 54 49 48 49 124 27 67 66 73 48 53 54 49 48 49 124 27 67 66 73 48 53 54 49 48 49 124 27 67 66 73 48 53 54 49 48 49 124 27 48 48 48 124 27 49 49 48 124 27 64 95 57 124 27 74 88 50 48 124 27 64 95 48 124 27 124 27 90 78 57 124 27 48 124 27 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 124 27 57 57 124 27 124 27 90 78 57 124 27 50 124 27 48 48 48 49 48 49 48 49 124 27 48 48 48 49 48 49 48 49 124 27 49 124 27 48 124 27 50 48 49 48 45 49 49 45 50 57 32 49 48 58 50 52 58 49 53 124 27 48 48 48 49 45 48 49 45 48 49 32 48 48 58 48 48 58 48 48 124 27 48 124 27 90 78 57 124 27 90 78 57 124 27 48 124 27 124 27 116 116 121 97 97 124 27 64 95 87 89 124 27 84 69 83 84 124 27 49 49 49 49 49 49 49 124 27 49 49 49 49 49 49 49 124 27 48 124 27 48 124 27 49 49 124 27 49 124 27 48 124 27 48 124 27 124 27 84 48 53 95 70 73 78 95 69 86 84 95 68 84 76 95 67 66 48 95 65 50 124 27 67 66 95 74 66 80 70 49 48 124 27 50 48 49 48 49 49 50 57 13
通过仔细观察,可以发现字段分隔符应该为 124 27 两个字符
所以在使用sdbimprt 导入工具时,应该调整为以下命令
/data/sdbadmin/bin/sdbimprt --ignorenull true -j 18 --trim both -e "12427" -r " " --type csv -s jushantest02 -p 11810 -c foo-l bar --file /data/testdata/test.txt --fields "COL1 string,COL2 string,COL3 string,COL4 string,COL5 string,COL6 string,COL7 string,COL8 string,COL9 string,COL10 string,COL11 string,COL12 string,COL13 string,COL14 string,COL15 string,COL16 string,COL17 string,COL18 string,COL19 string,COL20 string,COL21 string,COL22 string,COL23 string,COL24 string,COL25 string,COL26 string,COL27 string,COL28 string,COL29 string,COL30 string,COL31 string,COL32 string,COL33 string,COL34 string,COL35 string,COL36 string,COL37 string,COL38 string,COL39 string,COL40 string,COL41 string,COL42 string,COL43 string,COL44 string,COL45 string,COL46 string,COL47 string,COL48 string,COL49 string,COL50 string,COL51 string,COL52 string,COL53 string,COL54 string,COL55 string,COL56 string,COL57 string,COL58 string,COL59 string,COL60 string,COL61 string,COL62 string,COL63 string,COL64 string,COL65 string,COL66 string,COL67 string"
总结
一般开发者在做数据迁移时,最头疼的事情就是做数据格式的整理,所以在导入过程中遇到数据乱码或者是导入失败,首先应该通过od 命令检查数据真实的字符,是否存在不可见字符,如果是,则需要在导入时指定不同的切分符来完成数据的加载。