【问题标题】:How to Write/Generate CSV file from annotated java class如何从带注释的 Java 类写入/生成 CSV 文件
【发布时间】:2015-08-19 09:12:41
【问题描述】:

我有一个充满数据的对象。 现在我想创建带有注释的类,它允许我创建具有指定列顺序的 CSV 文件或任何通用解决方案。 我的数据表示有点复杂,意味着它带有对象列表。

例如:

class User {
public String name;
public int age;

List<Relatives> relativeList;
public User() {
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}

public List<Relatives> getRelativeList() {
    return relativeList;
}

public void setRelativeList(List<Relatives> relativeList) {
    this.relativeList = relativeList;
}
}

class Relatives {

public int id;
public String name;

public void setId(int id) {
    this.id = id;
}

public int getId() {
    return id;
}

public void setName(String name) {
    this.name= name;
}

public String getName() {
    return name;
}
}

我想用这个类的对象填充的数据创建 CSV 文件。

举例

User user = new User();
user.setName("Jackson");
user.setAge(32);
List<Relatives> relativeList = new ArrayList<Relatives>();
Relatives relatives = new Relatives();
relatives.setId(110);
relatives.setName("father");
relativeList.add(relatives);

relatives = new Relatives();
relatives.setId(111);
relativ.add(relatives);
relativeList.setName("mother");

user.setRelativeList(relativeList);

我想创建类似的 CSV 文本。

"name";"age";"relatives id1";"relatives name1","relatives id2";"relatives name2"
"Jackson";"30";"110";"father";"111";"mother"

如示例所述,如果我在 relativeList 中有 3 个元素,则应添加一个名为“relatives id3”和“relatives name3”的列。其中元素+子元素表示亲属+(id或name)。 除此之外,我想确定生成的 CSV 中列的顺序意味着 age 可以作为 name

这个问题的确切解决方案可能并不容易获得,但任何附近的解决方案都非常感谢并且会有所帮助。

【问题讨论】:

    标签: java csv annotations jackson opencsv


    【解决方案1】:

    对象中的List 是杀手。 OpenCSV 有一个 BeanToCsv 类可以将对象列表转换为 CSV 文件,但我怀疑它是否适用于集合(虽然从未尝试过)。

    如果你想限制一个人的亲戚数量,你仍然可以使用它。然后,您创建一个中间类,该类具有原始数据字段和一个构造函数,该构造函数采用您的User 类。然后使用 BeanToCsv 创建你想要的 csv 输出。

    但是听起来您不想限制用户的亲属数量。所以你可以使用 openCSV 来滚动你自己的。给定一个用户对象列表,您必须做四件事:

    1. 确定用户在您的列表中的最大亲属数量。
    2. 使用#1 中的值创建带有标题值的String 数组,以确定要放置多少相对名称和id 列。完成后,创建一个 List&lt;String []&gt; 并将数组放入列表中。
    3. 创建一个帮助类来将User 转换为String 数组。传入来自 #1 的值,因此如果您的亲属数量少于最大值,您可以使用空字符串或 null(您的选择)填充。使用此循环遍历用户对象列表,将每个用户转换为字符串数组,并将该数组添加到 #2 中创建的列表中。
    4. 在 openCsv 中使用 CSVWriter 调用 writeAll 方法,传入您在步骤 2 和 3 中创建和填充的列表。

    祝你好运:)

    【讨论】:

    • 感谢您的回答。
    • 我仍然需要您的帮助,因为您在评论中提供的解决方案似乎正在创建要立即写入 CSV 文件的整个列表。但是,如果我的数据太大,可能会产生问题。有什么解决办法吗。我可能误解了你的回答,直到现在我还没有尝试过你提供的解决方案,但这只是基于我的概述。
    • 啊——在这种情况下,CSVWriter 有一个 writeNext 方法,您只需传入一个字符串数组,该数组是您正在编写的 csv 文件的一行。在这种情况下,在上面的说明中,将 2 和 3 中的列表说明替换为 writeNext 调用,您不需要第 4 步。希望对您有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多