首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将包含ArrayList的对象的ArrayList写入CSV

将包含ArrayList的对象的ArrayList写入CSV
EN

Stack Overflow用户
提问于 2019-12-21 00:51:49
回答 2查看 458关注 0票数 0

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

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

代码语言:javascript
复制
public class CSVObject {
    String name;
    String title;
    String description;
    String ArrayList<String> color;
    String ArrayList<String> size;
    String ArrayList<float> price;
}

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

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

所需的文件输出如下所示:

代码语言:javascript
复制
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
...

我做了一些挖掘,发现How to serialize object to CSV file?中的Java CSV Library可以帮助将文件写入CSV,但我不确定如何将其格式化为所需的输出。那么我应该怎么做才能写出预期的文件呢?

EN

回答 2

Stack Overflow用户

发布于 2019-12-21 01:33:22

平面文件

Comma-Separated Values (CSV)Tab-Delimited格式适用于平面文件,每个文件中都有一个表。这意味着一组行都共享同一组列。

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

层次结构

根据您的Java类,您拥有一个hierarchy of data。这不适合CSV格式。方钉,圆孔。

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

不是真正的CSV

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

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

第一次浏览列表时,写出所有列。对于内部循环中的后续时间,取消这些值,只写入一个逗号字符来维护列计数。

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

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

票数 0
EN

Stack Overflow用户

发布于 2019-12-21 02:17:03

这里有一个快速和脏的,它假设你的颜色,价格和尺码的列表总是有相同的长度

代码语言:javascript
复制
interface CSVObject {
    String name();
    String title();
    String description();
    List<String> color();
    List<String> size();
    List<Double> price();
}

List<CSVObject> data = List.of();

String csv =data.stream()
            .flatMap(co->IntStream.range(0,co.color().size())
                    .mapToObj(i->new String[]{co.name(),co.title(),co.description(),co.color().get(i),co.size().get(i),co.price().get(i).toString()} ))
                    .map(sa-> Arrays.stream(sa).collect(Collectors.joining(",")))
                    .collect(Collectors.joining("\n"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59428798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档