0.数据Plain VS Format 问题:
数据格式众多,如txt、xls、xlsx、csv、word、xml、json和html等等。
一个问题:本地存储数据有必要用json吗?xml、csv、json这几种文件格式的优缺点是什么?各适用于什么环境中。
可以把这些数据格式分为两类,一类是无格式文档(plain text),即linux推崇的方式,文件都无需后缀名,一切信息都在文本(text)中。
另一类则是windows系统中衍生出来的各种带后缀名的格式文件,如xls,doc,ppt等。这些文件你直接用文本编辑器打开,就是乱码,人类是根本无法解读的。
1.数据在各个软件之间流动的问题:
在这里以txt、csv、sql数据库、Excel这四个管道中间来回游走过程为例,来说明问题。
首先,淮委给的数据格式是txt(通过查看txt,发现这个txt是从数据库里面导出来的),最坑人的是我们需要的每一条数据记录都需要两个关键属性A和B,但给的txt里面A和B属性是分开的,带有A属性和主键K的上百万条记录放在txt文件的上面部分,而带有B属性和主键K的上百万条记录放在txt文件的后面部分。这就需要将数据连接在一起。
①我把这个txt文本按照属性A和B,从文件中间切成两部分。
②分别对两个文件进行处理,剔除不需要的属性,保留主键K和属性A、B等。
③由于需要进行连接操作,我于是需要把两个文件导入到数据库中进行join操作。
此时,第一个坑来了。由于记录的每个属性是Tab隔开的,导入到数据库过程中始终出现各种错误,主要有记录中有各种异常字符,导致无法导入。还有就是将Excel也无法正确识别并打开用tab隔开的数据格式。
于是我用Notepad++进行正则匹配,把Tab键全部改成逗号,这样就改成了csv格式的文件。然后可以把csv直接导入到数据库库中。
第二个坑:Excel最多只能存储65536行记录,这就使得我无法先用Excel对csv文件进行初步的清洗操作,于是我准备用sql语言对数据进行清洗。另外,由于另一个同学想要xls格式文件的数据,所以我需要将清洗过后的数据导出成xls格式,但是又出现一个新坑,sql导出xls,一到16384行就终止了,说超出存储范围了。坑吧!!!
从这就可以看出Excel就是办公室白领才用的工具。大数据时代,由于Excel这个队友,sql server 2012也都鞭长莫及了,sql导入到Excel也就成摆设了。
④所以,我就只有将sql中清洗处理好的数据,导出为csv文件(或txt文件),但是sql server 2012一个坑爹的地方来了。SQL可以一次导出一个数据库中的多个表到Excel中。但是却一次只能导出一个表到一个csv文件里面。
所以,我以后准备清洗数据的时候,不用Excel了,该用命令行工具,如awk、seq、grep等工具。还有python带的各种数据处理包。
⑤在另外一个数据集进行清理的过程中,我也看到了Excel做的一个不错的用途。
0 -3.1 36.99
1 0.0 23
2 3.5 35.06
3 5.2 34.28
4 14.4 33.13
5 19.0 32.74
6 33.3 31.74
7 56.8 30.83
8 65.8 44
9 77.9 29.37
10 89.4 28.21
11 105.4 26.72
12 108.6 25.74
13 111.1 24.71
14 114.7 23.50
15 120.4 22.70
16 122.4 45
17 124.4 29
18 126.4 13
19 128.4 21.93
20 130.4 90
21 132.4 75
如果后面一个数据和前面一个数据的整数部分相同,则省略整数部分,仅保留小数部分。这样可以节约存储空间。
如下命令就可以解决:先把C1位置的数据复制到D1位置,然后再D2位置写出下面的函数就可以恢复出完整数据。
=IF(C2-INT(C2),C2,INT(D1)+C2/100)
还可以嵌套实现更加复杂的功能:
=IF(C2-INT(C2),C2,IF(C2>=10,INT(D1)+C2/100,INT(D1)+C2/100))。这个需求可以通过命令行工具实现吗?应该可以,想想如何实现。
⑥综上所述,Excel是无法处理大数据的,另外与sql交互的文件记录载体最好是csv或者txt文档。切记不要使用Excel了,可以其他格式----csv----sql处理----csv---其他格式(如xls等)。
python就有工具包(已经是命令行工具了)可以实现xls和csv格式的互转。即别人转给的xls,我首先转成csv格式,然后再考虑数据清洗处理的问题,sql处理完成后,然后再转换成csv。jq命令可以json,而json2csv可以将json转成csv。xml2json名称就知道其功能了。
更绝的方法是直接csvsql(csvkit套件中的一个工具,其他还有in2csv等工具),该工具可以直接在csv数据上执行sql查询,或者将csv插入到数据库中。csvgrep可以过滤csv表格数据,csvcut则可以从csv数据中抽取列,csvjoin则实现sql 的join操作。csvlook则可以以固定宽度的格式查看csv文件内容。csvsort可以对csv数据进行排序。csvstack可以将多个csv文件的行堆在一起。csvstat可以打印csv文件的所有列的描述性信息。