简单几行程序轻松分析Excel

随着互联网的快速发展,大数据时代的到来,数据资源的处理成了各行各业都面临的热点问题。除了通过特别专业、特别特别昂贵、特别特别特别复杂的分析平台来处理特别 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 字段关联取数

例子程序:

csv 过滤及汇总计算