首页 > 解决方案 > 将包含 ArrayList 的对象的 ArrayList 写入 CSV

问题描述

我的任务是从网页中抓取数据并将它们与其他信息一起写入 CSV。目前我使用 JSoup 来抓取网站,但我的问题是不确定如何将它们写入 CSV。

我将每个抓取页面的数据存储在一个对象调用 CSVObject 中:

public class CSVObject {
    String name;
    String title;
    String description;
    String ArrayList<String> color;
    String ArrayList<String> size;
    String ArrayList<float> price;
}

我将这些对象存储在ArrayList<CSVObject>

名称、标题、描述来自抓取的数据,但颜色、尺寸和价格来自用户输入。他们可以选择多个,它将​​添加到对象中的 ArrayList 中。

所需的文件输出是这样的:

Name         Title           Description         Color         Size         Price
Shirt        Holiday Shirt   Shirt Description   Black         S            15.99
Shirt                                            Black         M            19.99
Shirt                                            Black         L            24.99
Shirt                                            Green         S            15.99
Shirt                                            Green         M            19.99
Shirt                                            Green         L            24.99
Pants        Movie Pants     Pants Description   Red           S            17.99
...

我做了一些挖掘并在如何将对象序列化为 CSV 文件中找到了Java CSV 库?可以帮助将文件写入 CSV,但我不确定如何将其格式化为所需的输出。那么我应该怎么做才能按预期编写文件呢?

标签: javacsvarraylist

解决方案


平面文件

逗号分隔值 (CSV)制表符分隔格式适用于平面文件,每个格式都有一个表格。这意味着一组行都共享同一组列。

要导出示例数据中的数据,请重复您已抑制的第一列中的值。然后,您将拥有一组共享同一组列的行。

等级制度

根据您的 Java 类,您有一个data 层次结构。这不适合 CSV 格式。方钉,圆孔。

为了匹配 Java 类的结构,您应该以XML或 JSON 等分层格式序列化数据。

不是真正的 CSV

如果您坚持使用您展示的那种不是真正的 CSV 格式,则需要嵌套循环。

循环您的一组对象。对于每个对象,循环其中包含的列表。

在第一次浏览列表时,写出所有列。对于内部循环中的后续时间,抑制这些值,仅写入一个逗号字符以保持列数。

直截了当的逻辑,没有什么棘手的,遵循与将这些值手写到纸上时相同的步骤。

当然,任何包含分隔符(COMMA 等)的字段值都必须用引号引起来。或者只是将所有字段括在引号中。


推荐阅读