将空行分隔出的不定行合并成逗号分隔串

例题描述和简单分析

有文本文件sample.txt,如下:

CHM 110 - 10

9:30 am - 10:45 am

Thursday

 

CSC 150 - 04

10:30 am - 11:45 am

Monday

11:30 am - 12:45 am

Wednesday

 

BIO 132 - 01

需要按空行分隔出的不定行合并成逗号分隔串,结果导出 csv 文件,如下:

CHM 110 - 10,9:30 am - 10:45 am,Thursday

CSC 150 - 04,10:30 am - 11:45 am,Monday,11:30 am - 12:45 am,Wednesday

BIO 132 - 01

解法及简要说明

方法1:串

在集算器中编写脚本 p1.dfx,如下所示:


A

1

=file("sample.txt").read()

2

=A1.split("\n").group@i(~[-1]=="").(~.select(~!="")).concat@nc()

3

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

简要说明:

A1  txt读成串

A2  按换行符 \n 把串拆成序列,按空行分组并去掉空行,按换行符和逗号将序列的序列拼成串(串拆成序列时,要注意文本的行分隔符,通常地,Unix 和 MacOS X 用 \n,Windows 用 \r\n。SPL 中可以用 import@i 避免这种问题。)

A3  串 A2 写入result.csv文件

方法2(学习扩充):序表

在集算器中编写脚本 p1.dfx,如下所示:


A

1

=file("sample.txt").import@i()

2

=A1.group@i(~[-1]==null).(~.select(~))

3

=A2.(~.len()).max()

4

=create(${to(A3).concat@c()})

5

=A2.(~.pad(null,A3)).conj()

6

=A4.record(A5)

7

=file("result.csv").export@c(A4)

简要说明:

A1  txt读成序列

A2  按空行分组并去掉空行

A3  算出最大列数

A4  按最大列数建空序表

A5  把数据补齐(因为要用 record 依次填到空序表里)

A6  填数据

A7  序表 A4 导出成result.csv

JAVA 集成这段代码的方法可参考:《Java 如何调用 SPL 脚本》

问答搜集

https://stackoverflow.com/questions/60467971/how-to-format-a-large-string-with-a-pattern-that-changes-sometimes-into-a-csv-fo