又是使用excel的一天,因为我是编程婴儿,所以能用excel解决的问题我尽量还是希望使用excel解决。男朋友总是有莫名其妙的需求,逼我成长为excel中学生。
今天他去学校拷贝数据,不知道是因为数据本身烂,还是他脑子出问题,数据保存为txt文件后,乱做一团,我根本看不出来这个表的结构,还以为是天女散花。他说他要再进去重新拷的时候,警察不让进了。他就让我整理。
先看看这个表的表头:
可怕吗?我崩溃了,这什么?而且数据还很大,几百M。直接打txt还打不开,这个界面,还是我导入python之后才得到的。
看到这样的数据我绝望了,我说我弄不了。男朋友说,给我200,我说给200也不干。他激我,说给你两万,我当时正在气头上,而且前面经过一番尝试,觉得真的做不了,就说给两万也做不了,气呼呼地说谁缺你这两万。
我一干活真的容易生气。尤其看到这种稀烂的数据,表头就乱死了,我都不知道有多少个变量。就算忽略表头,后面的数据也对不齐,无论用什么分隔符,python都分割不成稍微结构化一点的数据,只能是一列。
后来男朋友说他把数据导入acces里,就变成表了,只是比较乱,可需要整理。
他说很简单,你就看第一列有没有日期,有日期的就是一条记录,就把一坨一坨合并到一个格子里就好了,去做吧。
我烦躁死了,我印象中,总觉得我做过类似的工作,但是也不记得怎么做的,好像没有这么麻烦。错误分行的数据怎么弄,我一下还真没想到办法,但是从直觉上不想用python解决这个问题。即使这个数据有18万行,我还是硬着头皮用excel做吧。很卡。
合并两列的数据还是挺简单的,就直接:A1&A2就好了。空格就是" "。
1.去除全部记录都是空值的空行
先用一个函数 :=counta() 计算这一行有几个值,这样值为0的,就是纯空行。或者isblank()可以判断是否是空值。
然后筛选,把值为0的筛选出来,然后选中,删掉。这个地方其实应该用定位(ctrl+G),定位可见行,然后删除。但是由于数据太大了,一定位就死机,而且会把第一行也删掉,所以我只能手动选中。
这里学到一个小技巧,点住单元格,然后ctrl+shift+↓,可以快速选中这里往下所有的数据,其他方向同理。偶尔有几次会失灵,跑到整个excel的边界,不知道为什么,还没找到规律。
空白行删掉之后,
十八万条数据,变成十万条,操作起来顺畅很多。数据变成这样:
接下来的任务是把一坨一坨分行的数据,合并成一格一格。比如C3单元格的里,应该填AFF RWS MRK,这三行其实属于一条记录,是导入数据的时候识别错了。、
2.怎样把单元格里的值作为行号写到公式里
C3单元格的值应该是合并C3:C5,我先添加了一列序号,然后通过公式:=IF(ISBLANK(B3),"",A3),和=IF(ISBLANK(B3),"",A3-1),把日期对应的行号和下一行日期之前的行号记下来。
这里其实不用加这一列数,用公式=ROW()就可以得到某个单元格的行号,=column()可以得到列号。
这两列表示合并范围的数记下来之后,先对齐,然后去空行,把日期去空行放在第一列。
我最后是用这个公式:=TEXTJOIN(" ",1,INDIRECT("C"&I3&":C"&J3)),得到我想要的数据的,后面几列一样的。
INDIRECT("C"&I3&":C"&J3) 这部分很重要,这样写就可以把两列数,变成行号去引用了。这个部分的意思是表示:C3(3来自I3):C5(5来自J3)。
列名字母要用英文双引号" "框起来,和选取的单元格的索引用“ & ” 连接,冒号也要写到双引号里面,这里面小符号太多,总容易写错,我对照着写了好几遍,总是出错,都看不出哪儿错,烦。
=TEXTJOIN(“分隔符”,跳过空值,范围)这个公式是用来合并几个单元格的内容的,比&和 =CONCATENATE()好的地方是,这个函数可以写范围,那两个不行。
最后就得到了长这样的数据:
3.今天用到的一些小功能
分列:选中一列,搜索excel里的分列功能,可以选分隔符或者固定宽度分。
countif(范围,值):检查一个值在不在一个范围里
=IF(ISNUMBER(FIND("RDS",B2)),1,0):这个字符在不在某个单元格中,应该是FIND("RDS",B2)返回一个位置或false,ISNUMBER()来判断,然后if。没细研究,应该是。
还有什么不记得了,
现在写起来其实步骤不多,而且也不难,但是刚开始做的时候我真的不知道怎么做。也许我的办法是笨办法,无论是excel还是python都有更简单的办法做,但是我水平就到这了。
用excel这么折腾的原因是,我实在懒得想怎么编程,其实我觉得应该好编,但是我不想去动那个脑子。做事情就是这样,偷懒不用脑,就是要耗时间,而且费劲。写几个for,while,if,应该就解决了。
今天还做了不少手动重复性的工作,原因就是懒得动脑,不想想怎样编程。
这里我要说一句金句:勤快就是懒,懒就是勤快。
我要是编程水平更高一些就好了,我就不会这么害怕编程,最后又能好好处理数据,还能增长编程技能。
累个半死,还一直在骂人。得到男朋友给的一些钱财,气还顺了一些。