将 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