我的任务是从网页上抓取数据,并将它们与其他信息一起写入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
...我做了一些挖掘,发现How to serialize object to CSV file?中的Java CSV Library可以帮助将文件写入CSV,但我不确定如何将其格式化为所需的输出。那么我应该怎么做才能写出预期的文件呢?
发布于 2019-12-21 01:33:22
平面文件
Comma-Separated Values (CSV)和Tab-Delimited格式适用于平面文件,每个文件中都有一个表。这意味着一组行都共享同一组列。
要导出示例数据中显示的数据,请重复第一列中已隐藏的值。然后,您将拥有一组行,所有行都共享同一组列。
层次结构
根据您的Java类,您拥有一个hierarchy of data。这不适合CSV格式。方钉,圆孔。
为了匹配Java类的结构,您应该以分层格式序列化数据,比如XML或JSON。
不是真正的CSV
如果您坚持使用您所展示不是真正的CSV格式,那么您需要嵌套循环。
循环您的对象集。对于其中的每个对象,循环其中包含的列表。
第一次浏览列表时,写出所有列。对于内部循环中的后续时间,取消这些值,只写入一个逗号字符来维护列计数。
直截了当的逻辑,没有什么棘手的,遵循相同的步骤,如果您将这些值手写到纸上。
当然,任何包含分隔符(逗号等)的字段值必须用引号括起来。或者只用引号将所有字段括起来。
发布于 2019-12-21 02:17:03
这里有一个快速和脏的,它假设你的颜色,价格和尺码的列表总是有相同的长度
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"));https://stackoverflow.com/questions/59428798
复制相似问题