行列的上层分类互转

举例

1:列转行

有 Excel 文件 csv.csv,数据如下所示:

C1



C2



C3



Meat

oil

Vegetable

Meat

Vegetable

oil

Meat

oil

Vegetable

8

6

4

18

62

24

11

12

13

csv 文件里 N 条横向摆放的数据,第1行是每个数据的国家字段的值,第2行是每个数据的其他列名,第3行是每列对应的数值。现在要将该文件整理成规范的行式数据,结果如下:

country

Meat

Vegetable

oil

C1

8

4

6

C2

18

62

24

C3

11

13

12

编写 SPL 脚本:


A

1

=file("csv.csv").read()

2

=A1.split@n(",")

3

=transpose(A2).run(if(~(1)=="",~(1)=~[-1](1)))

4

=create(country,cate,value)

5

>A3.(A4.record(~))

6

=A4.pivot(country;cate,value)

7

=file("result.csv").export@ct(A6)

A1  把 csv 的数据读成串

A2  把串拆成序列的序列

A3  转置序列的序列,把第一列国家补完整

A4  建空序表 (country,cate,value)

A5  将 A3 的数据依次填入序表

A6  用 pivot 函数行转列

A7  结果导出到 result.csv

2:行转列

有 Excel 文件 csv.csv,数据如下所示:

country

Meat

Vegetable

oil

C1

8

4

6

C2

18

62

24

C3

11

13

12

首行是列名,分别是国家和其他信息列。现在要将该文件整理成如下形式:

C1



C2



C3



Meat

Vegetable

oil

Meat

Vegetable

oil

Meat

Vegetable

oil

8

4

6

18

62

24

11

13

12

编写 SPL 脚本:


A

1

=file("csv.csv").import@ct()

2

=A1.pivot@r(country;cate,value;Meat,Vegetable,oil)

3

=A2.group(country).(~.run(country=if(#==1,country,""))).conj()

4

=transpose(A3.(#1|#2|#3)).concat@nc()

5

=file("result.csv").write(A4)

A1   读取 csv 数据

A2   列转行操作,将列名Meat,Vegetable,oil作为 cate 的值,原Meat,Vegetable,oil列对应的数值作为 value 列的数据

A3  按国家分组,每组非首行国家数值为空,合并

A4  合并各列,变为序列的序列,对序列的序列转置后按逗号、回车符转成串

A5  A4的结果串写入 result.csv