上一节讲述了结构化文本的一些基本运算,本节继续用案例讲述二目运算和综合运算。
二目运算
集合运算(文件比较)
现有文件f1.txt和f2.txt,第一行是列名,需要对文件中的Name字段进行交集运算。部分数据如下:
文件f1.txt:
Name Dept Rachel Sales Ashley R&D Matthew Sales Alexis Sales Megan Marketing |
文件f2.txt:
Name Dept Emily HR Ashley R&D Matthew Sales Alexis Sales Megan Marketing |
代码如下:
A | B | |
1 | =file("E:\\f1.txt").import@t() | =file("E:\\f2.txt").import@t() |
2 | =[A1.(Name),B1.(Name)].isect() |
函数isect用于集合间的交集运算,A1.(Name)表示取出A1的Name列,形成一个集合,B1.(Name)表示取出B1的Name列。本案例的最终结果如下:
类似地,求并集用函数union,差集可用diff,合集可用conj(相当于union all)。也可以直接用运算符来代替函数,写法更加简洁,比如交集,并集、差集、合集可以改写为:
A1.(Name) ^ B1.(Name)
A1.(Name) & B1.(Name)
A1.(Name) \ B1.(Name)
A1.(Name) | B1.(Name)
上面的示例显示了读入文本文件并自动拆分为字段后,仅取其中的某一列进行集合运算。那如果想不拆分字段,对整行数据一起比较呢?很简单,在导入的选项加上 s 即可,表示不拆分字段。但需要注意的是,不进行拆分后,相当于直接返回一个只有一列的序表,且此时的列名也没有拆分,变成了Name(Tab)Dept,也就是此时的列名中包含了不可见字符 Tab,这列名是非法的,都没法直接引用了。不过还好可以用序号来表示第几列,此时的代码如下:
A | B | |
1 | =file("D:\\f1.txt").import@ts() | =file("D:\\f2.txt").import@ts() |
2 | =A1.(#1)^B1.(#1) |
显然,不拆分字段时,肯定只有一列,与其得到一个非法的列名,还不如不要列名,直接返回成集合(序列)多好,此时需要额外加上选项 i,表示只有一列数据时,直接返回成序列。此时交集直接就是集合的运算了,写成 A1^B1 即可,代码如下:
A | B | |
1 | =file("D:\\f1.txt").import@tis() | =file("D:\\f2.txt").import@tis() |
2 | =A1^B1 |
上面两种算法,得到的都是相同的结果: