事件要从上周四说起,
小G同学要处理海量的excel表的数据,大致要求是:一excel表其中一列的数据是按顺序排列的,此列中的数据有重复,现需要将在这列所有的数据按出现的顺序加上四位数,比如第一行的数据是12345,它是第一次出现,则将数据改写为123450001,同理当12345第二次出现时,将其改写为123450002,依此类推。
起初拿到问题,由于对excel的函数处理方法不熟悉,而另写一个程序来完成又嫌读写文件转换太麻烦了,想偷个懒,(懒惰思想作祟,自己吃傻亏...)就使用了最原始的方法,先把同一列中所有相同的项全部筛选出来,然后手动的添加0001,0002.....等等。当时觉得只有几千个数据也不需要太长时间,后来添加的时候才发现有多痛苦,速度慢不说,还担心会由于惯性而出错。所以改好一个1000多个数据的表,前后也将近花了半个小时,在改的过程中,暗下决心,以后再也不手动地改大量数据了,要使用程序来批处理。
戏剧化的一幕出现了,下午小G同学拿了另一个excel表格来改,此次有数据两万多条,OMG,这时再用懒办法就行不通了,而且晚上就要改好,时间急迫,但还是要慢慢来想办法用程序来处理。经过与实验室兄弟姐妹讨论过后,知道两种行实现途径,1)用Matlab将excel表中的那列的数据读出来,并用一个数组存放,然后再对这个数组进行编程操作,实现对数据的改写。2)在Linux下使用gawk工具来完成字符串的改写。
对方案2不熟悉,所以采用方案1,但由于字符串向整型数字转换的过程中总出问题,无法正确地显示。调试了很久无果,最后在小Z同学的帮助下使用gawk工具按时地完成了任务。对于gawk这个工具很好奇,要好好看看。
周末有空,研究了下如何用excel来解决这个问题。通过上网查资源和自己摸索说明文档,找到解决途径如下:
- 首先想到用countif()函数对需修改列进行计数排序,利用公式COUNTIF(AC$3:AC3,AC3)来排序,但是发现它会把所有的数都认为是相等的,即认为4211270010020001=4211270010020002,后来发现是因为这个数太大了,超出可表示的范围而导致溢出,进行四舍五入后认为上述两个数是相等的。
- 这时只能求助于取位函数MID()或Right()取4211270010020001的后8位形成新的一列A,然后对列A进行countif()运算,即可得到正确的解,形成新列B。针对此excel表,其中有一点需要注意:在第8位上,前10000多个数据此数位上为0,剩下的数据此位为非0,此时要分开处理,取倒数8或9位。在countif()中是对数字处理,所以需要让首位非0.
- 在新列B中,利用公式让B+10000,然后利用Right函数取B中数据的后四位形成新列C,然后利用&操作符把C串接到原始列中,即得到了所需的数据列。
费了一番周折,知道了怎么通过excel表中的函数来解决这个问题。
不回避问题,直视它,然后想办法去解决它,这个过程中会学习到很多,要养成一种自己动手去解决问题习惯。
这个东西不熟? 学嘛... 这个方面知识不会? 学嘛.... 不会?学嘛。这么简单的问题一直都明白,但也一直在被内在懒惰 的 心理窝藏着而一再地回避,浪费了多少学习的机会啊!想想内心就发凉。
再次想起"Thought is already is late, exactly is the earliest time." 从即日起,养成这种习惯。
PS:关于gawk软件,加入待办list,学习后再附上使用方法与心得。