Excel 根据条件合并几行

又是使用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,应该就解决了。

今天还做了不少手动重复性的工作,原因就是懒得动脑,不想想怎样编程。

这里我要说一句金句:勤快就是懒,懒就是勤快。

我要是编程水平更高一些就好了,我就不会这么害怕编程,最后又能好好处理数据,还能增长编程技能。

 

累个半死,还一直在骂人。得到男朋友给的一些钱财,气还顺了一些。

 

posted @ 2020-06-24 19:53  haolemao  阅读(2522)  评论(0编辑  收藏  举报