【问题】
Is there a Java library that would allow me to parse CSV files that have headers defined on multiple lines? Here's an example for such a CSV :
$ID$,$Customer$ Cust1, Jack Cust2 , Rose $Name$,$Location$ Sherlock,London Clouseau,Paris
The "$" symbol indicates the presence of headers on that line, and the values in subsequent rows map to these headers.
【回答】
复述问题为:每个二维表行数相同,首行是字段名,将纵向拼接的N个窄二维表规范化为横向拼接的宽二维表。按照是否包含$将数据分为N个二维表;新建空二维表,列名为各二维表的首行;取出各二维表第2至最后一行,按顺序依次拼接起来,作为空二维表的记录;将记录填入空二维表。
上述算法涉及分组运算、有序运算、动态二维表,用JAVA实现复杂度相当高,但用SPL则简单多了:
| A | |
| 1 | =file("d:\\source.csv").import@c() |
| 2 | =A1.group@i(left(#1,1)=="$") |
| 3 | =create(${A2.conj(~(1).array()).concat@c()}) |
| 4 | =to(2,A2(1).len()).conj((t=~,A2.(~(t).array()).conj())) |
| 5 | =A3.record(A4) |
A1:读取文件source.csv的内容。

A2:分组,将第一列以$开头直到下一个以$开头的数据分为一组。


A3:创建一个由A2各组第一行内容组成的二维表。

A4:从A2各组第二行开始依次取得同一行数据,组成序列返回。

A5:用序列A4的成员组成序表A3的新记录。

上述代码很容易和JAVA集成,参考Java 如何调用 SPL 脚本。
博客讨论了如何处理具有多行定义的CSV文件头,并将其转换为横向拼接的二维表。使用Java库处理这种复杂的CSV格式具有挑战性,但通过SPL脚本可以简化此任务,涉及分组、有序运算和动态列的操作。
686

被折叠的 条评论
为什么被折叠?



