java - SuperCSV 从多个文件读取并解析为一个 bean 对象

标签 java csv supercsv

我目前正在尝试使用 beanReader 读取多个 CSV 文件,然后从每个文件中获取几列并将它们解析为一个 bean。

到目前为止,我似乎无法将不同文件中的列解析为一个 bean 对象。这对于 ICsvBeanReader 来说是可能的吗?

最佳答案

是的,这是可能的:) 从 Super CSV 2.2.0 开始您可以读入现有的 bean(请参阅 javadoc )。

以下示例同时使用 3 个读取器(操作 3 个不同的文件) - 第一个读取器用于创建 bean,另外 2 个仅更新现有 bean。此方法假设每个文件具有相同的行数(并且每个行号代表同一个人)。如果它们不这样做,但它们共享一些唯一标识符,则您必须首先将第一个文件中的所有记录读入内存,然后从标识符上的第二个/第三个匹配进行更新。

我试图让它变得更智能,这样您就不必对名称映射进行硬编码 - 它只是将其不知道的 header 清空(这样 Super CSV 就不会尝试映射您的 bean 中不存在的字段 - 请参阅网站上的 partial reading examples)。当然,这仅在您的文件具有 header 时才有效 - 否则您只需在适当的位置对带有空值的映射数组进行硬编码。

人bean

public class Person {
    private String firstName;
    private String sex;
    private String country;
    // getters/setters
}

示例代码

public class Example {

    private static final String FILE1 = "firstName,lastName\nJohn,Smith\nSally,Jones";
    private static final String FILE2 = "age,sex\n21,male\n24,female";
    private static final String FILE3 = "city,country\nBrisbane,Australia\nBerlin,Germany";
    private static final List<String> DESIRED_HEADERS = Arrays.asList("firstName", "sex", "country");

    @Test
    public void testMultipleFiles() throws Exception {

        try (
            ICsvBeanReader reader1 = new CsvBeanReader(new StringReader(FILE1), CsvPreference.STANDARD_PREFERENCE);
            ICsvBeanReader reader2 = new CsvBeanReader(new StringReader(FILE2), CsvPreference.STANDARD_PREFERENCE);
            ICsvBeanReader reader3 = new CsvBeanReader(new StringReader(FILE3), CsvPreference.STANDARD_PREFERENCE);){

            String[] mapping1 = getNameMappingFromHeader(reader1);
            String[] mapping2 = getNameMappingFromHeader(reader2);
            String[] mapping3 = getNameMappingFromHeader(reader3);

            Person person;
            while((person = reader1.read(Person.class, mapping1)) != null){
                reader2.read(person, mapping2);
                reader3.read(person, mapping3);
                System.out.println(person);
            }
        } 

    }

    private String[] getNameMappingFromHeader(ICsvBeanReader reader) throws IOException{
        String[] header = reader.getHeader(true);

        // only read in the desired fields (set unknown headers to null to ignore)
        for (int i = 0; i < header.length; i++){
            if (!DESIRED_HEADERS.contains(header[i])){
                header[i] = null;
            }
        }

        return header;
    }
}

输出

Person [firstName=John, sex=male, country=Australia]
Person [firstName=Sally, sex=female, country=Germany]

关于java - SuperCSV 从多个文件读取并解析为一个 bean 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27776681/

相关文章:

java - 输出数字,小数点后不带数字

java - 对来自不同类的对象的数组列表进行排序

java - 使用 `String` 时,如何告诉 SuperCSV 映射空的 `CsvDozerBeanWriter` 属性?

java - 泛型通配符的正确使用

Java:没有空格的空字符

regex - 从 csv 文件的整数字段中删除文本

php - 使用 php 函数写入 csv 时,0 被截断

java - 将哈希表转换为表格结构

java - super CSV 和分组分隔符

java - 生成的 CSV 文件中不需要的双引号