码迷,mamicode.com
首页 > 其他好文 > 详细

妙用集算,掌上观文

时间:2018-07-17 10:35:03      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:excel   img   write   http   贸易战   复杂   常见   sim   很多   

随着互联网的快速发展,大数据时代的到来,数据资源的处理成了各行各业都面临的热点问题。除了通过特别专业、特别特别昂贵、特别特别特别复杂的分析平台来处理特别x4海量的数据外,我们还常常会遇到Excel(xls,xlsx)文件这样手边能够即时获得的数据文件。使用Excel记录、处理和交换数据,是因为这个软件的简单方便,而如果又需要通过一堆外部调用来进行后续的分析处理,那就会显得十分笨拙。现在我们就来分享一下如果通过轻量级地使用集算器来分析处理Excel形式的数据来源。

最近,中美贸易战愈演愈烈,我们也来蹭一下热度,用一些公开获得的中美两国的经济指标做个简单对比,模拟一下实战的场景,找一下掌上观文,了如指掌,一切尽在掌握的感觉……

下面是我们用到的基础数据文件Indicators.xlsx,其中,每个工作表是一个国家的各项指标:

技术分享图片

接下来,我们打开集算器了,写下第一行脚本:

=file(“Indicators.xlsx”)=A1.xlsopen()

然后我们把脚本文件保存到和Indicators.xlsx数据文件一个目录下,以方便引用相对路径,名称就叫indicators.dfx。

说明一下,”=”开头的格子称为“计算格”,其中的表达式的计算结果会自动赋予单元格,后面的脚本中就可以用单元格名称(A1、C25等等)来直接使用了。同时,这里用到了两个函数。第一个是file()函数,返回一个文件对象。参数”Indicators.xlsx”是文件名,因为这里写的是相对路径,所以会在indicators.dfx文件的同级目录查找。第二个是xlsopen()函数,把文件对象A1当做一个Excel工作簿对象打开。

集算器的好处是可以随时进行测试,我们就来看一下现在的状态,点击“执行”图标后,结果如下:

技术分享图片

在右侧面板,可以看到Excel文件被显示为一个表格,除去最左侧的序号列,第一列是工作表名称,第二列和第三列分别是工作表的行列数。这三个字段构成了一个数据结构。若干条具有这个数据结构的记录组成了一个有序的集合,我们称之为“序表”。如果有序集合中不是具有相同数据结构的记录,而只是一般的一些数据成员,那么我们就称之为“序列”,所以说,序表是一种特殊的序列。集算器对于序列和序表提供了大量的函数,能够支持各种复杂运算,因此,这两种数据对象在集算器中会经常遇到。

接下来,我们就要读取工作表的内容了,先看脚本:

=B1.xlsimport@t()

xlsimport()函数是从工作簿对象B1中导入一个工作表。这里用到了@t选项,这个选项会把首行内容作为标题而不是数据(这是Excel表格常见的样子)。选项需要写在函数名后,以@开头,多个选项只需要写一个@,例如@tx。这里我们没有使用参数,所以函数会默认导入第一个工作表的全部内容。再点下“执行”看看结果,如下:

技术分享图片

可以看到第一个工作表的内容导入成了一个序表。不过这里我们会遇到第一个问题,每个经济指标Indicator包括两行,第二行是指标更新的时间,是我们不关心的内容。集算器的序表要解决这类问题非常简单,加一个选出函数就可以了:

=B1.xlsimport@t().select(Indicator!=null)

select()是选出函数,参数Indicator!=null是选出条件,也就是根据Indicator列是不是空来决定是不是选择这一行内容,还是执行看下效果:

技术分享图片

筛选无效(不感兴趣)数据的的问题已经解决,继续研究发现每个指标中的Last是我们需要关心的,因此我们希望只导入Indicator和Last字段。脚本调整如下:

=B1.xlsimport@t(Indicator,Last).select(Indicator!=null)

技术分享图片

这里用到了xlsimport()函数的选出字段参数,”Indicator,Last”就是希望选出的字段名(逗号分隔)。接下来专门导入中国的数据:

=B1.xlsimport@t(Indicator,Last;”China”).select(Indicator!=null)

这里参数又增加了一个”China”,指定了要导入的工作表名称,与前面的字段参数用”;”隔开。(还可以指定导入的开始行和结束行,因为例子中没有用到就不介绍了,有兴趣的话可以参考教程文档试验一下。)执行后就可以看到中国的指标了:

技术分享图片

现在开始进行简单的比较,把两个表根据Indicator连接起来:

=A2.join(Indicator,B2:Indicator,Last:’China’)

这里使用到了join()函数,用单元格A2的字段Indicator匹配单元格B2的键Indicator,找到相应记录后拼上B2的Last字段,并使用字段名’China’拼到A2序表中,如下图:

技术分享图片

然后把美国的Last更名为US:

=A2.join(Indicator,B2:Indicator,Last:’China’).rename(Last:’United States’)

这里的rename()函数用来修改序表的字段名,每个字段修改用”:”映射,Last是曾用名,’United States’为新字段名:

技术分享图片

前面提到过,集算器对于序列和序表提供了很多函数进行计算,用起来十分方便。这里我们就利用sort函数,把中美指标按照差距大小进行排序:

=A3.sort@z(abs(‘United States’-‘China’))

这里用到了sort()函数进行排序,@z选项用来使结果降序排列。参数是用做排序依据的表达式,这里用美中指标进行了简单的差值,然后用abs()函数计算绝对值。结果如下:

技术分享图片

至此,需要的数据已经整理好了。为了以后可以重复使用,我们把这个比较结果添加到工作簿的一个新工作表’US vs China’中,并写回到源文件中:

>B1.xlsexport@t(A4;”US vs China”)>A1.xlswrite(B1)

前面提到过“=”开头的是计算格,这里又遇到了一种”>”开头的格子,我们称之为“执行格“。执行格执行后不会自动为单元格赋值。

这里用到的xlsexport()函数用来把序表A4写到工作簿对象B1中,”:”隔开的第二个参数是工作表名称。这里同样用到了选项,这里的@t表示需要导出标题行到工作表中。而xlswrite()函数则把工作簿对象B1写出到文件对象A1。

技术分享图片

最后,我们打开excel文件查看一下最终结果:

技术分享图片

简单的几行脚本,Excel文件多个工作表的导入、连接、排序、导出等功能就轻松实现了。这还只是揭开了集算器的一角,还有更多的功能等待着我们去探索和应用。

完整脚本参考如下:


                                                       A                                                          B
1=file(“Indicators.xlsx”)=A1.xlsopen()
2=B1.xlsimport@t(Indicator,Last).select(Indicator!=null)=B1.xlsimport@t(Indicator,Last;”China”).select(Indicator!=null)
3=A2.join(Indicator,B2:Indicator,Last:’China’).rename(Last:’United States’)
4=A3.sort@z(abs(‘United States’-‘China’))
5>B1.xlsexport@t(A4;”US vs China”)>A1.xlswrite(B1)


妙用集算,掌上观文

标签:excel   img   write   http   贸易战   复杂   常见   sim   很多   

原文地址:http://blog.51cto.com/12749034/2145143

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!