将 csv 文件转成多层 xml 文件
例题描述和简单分析
有 csv 文件 csv.csv,数据如下所示:
UserID,Number,IPF,PointNumber,Length
37686,4851,2,0,127.9
37686,9978,2,0,0
37686,9994,2,0,0
11111,9994,2,0,0
需要转成多层 xml 文件,结果如下:
<?xml version="1.0" encoding="GBK"?>
<xml>
<Plant>
<UserID>11111</UserID>
<Verification>
<Detail>
<Number>9994</Number>
<IPF>2</IPF>
</Detail>
</Verification>
<PointNumber>0</PointNumber>
<Length>0.0</Length>
</Plant>
<Plant>
<UserID>37686</UserID>
<Verification>
<Detail>
<Number>4851</Number>
<IPF>2</IPF>
</Detail>
<Detail>
<Number>9978</Number>
<IPF>2</IPF>
</Detail>
<Detail>
<Number>9994</Number>
<IPF>2</IPF>
</Detail>
</Verification>
<PointNumber>0</PointNumber>
<Length>127.9</Length>
</Plant>
</xml>
解法及简要说明
在集算器中编写脚本 p1.dfx,如下所示:
A |
|
1 |
=file("csv.csv").import@ct() |
2 |
=A1.group(UserID;~.new(Number,IPF):Detail,PointNumber,Length) |
3 |
=A2.new(UserID,create(Detail).record([Detail]):Verification,PointNumber,Length) |
4 |
=file("xml.xml").write(xml(A3,"xml/Plant")) |
简要说明:
A1 csv文件读成序表
A2 A1序表按 UserID 分组,将组内的 Number,IPF 生成新序表 Detail,取组内第一条 PointNumber,Length
A3 基于 A2 序表创新新序表,其中 UserID 不变,将每条记录中的 Detail 序表作为一条记录插入新序表 Verification 的 Detail 字段中,PointNumber 不变,Length 不变
A4 A3序表按层标识"xml/Plant"解析为 xml 串,写到 xml.xml 文件
JAVA 集成这段代码的方法可参考:《Java 如何调用 SPL 脚本》。
https://stackoverflow.com/questions/62655557/compare-current-line-and-previous-line-of-the-csv-file
英文版