当我不知道CSV文件中列的顺序时,如何读取CSV文件并将信息存储在类中?

tpgth1q7  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(175)

我有一个作业,需要读取CSV文件。我知道CSV文件的第一行包含以下信息:
标签A、标签B、标签C、标签D
并且下面的所有行都将包含相应的信息,因此CSV文件的所有以下行如下所示:
信息A、信息B、信息C、信息D
我已经创建了一个类来存储所有这些信息,然后我需要创建一个HashMap来存储所有这些对象,每个对象都有不同行的信息,但是,我要阅读的CSV文件的列顺序是随机的,因此我可能会收到一个CSV文件,它的第一行如下:
标签D、标签A、标签B、标签C
这将使以下行成为:
信息D、信息A、信息B、信息C
我该如何处理这个问题呢?不管CSV文件的列的顺序如何,我都需要将这些信息正确地存储在一个对象中。
在这个赋值之前,列的顺序总是相同的,所以我将每一行存储在一个字符串中,然后拆分字符串,然后将信息按该顺序放入对象的构造函数中,但我不能再这样做了,因为顺序将是随机的。
除了java.io.File、java.util.Scanner和java.util.HashMap之外,不允许我使用任何依赖项。

zsbz8rwp

zsbz8rwp1#

如果您只想使用core java,可以尝试以下操作:

public class Main {
    public static void main(String[] args) {
        StringReader reader = new StringReader(
                """
                        Col1,Col2
                        aa,bb
                        cc,dd
                        """);

        Scanner scanner = new Scanner(reader);

        String[] header = scanner.nextLine().split(",");
        Map<String, Integer> mapping = new HashMap<>();
        for (int i = 0; i < header.length; i++) {
            mapping.put(header[i].trim(), i);
        }

        List<MyBean> list = new ArrayList<>();
        while (scanner.hasNext()) {
            String[] data = scanner.nextLine().split(",");
            MyBean value = new MyBean();
            value.setColum1(data[mapping.get("Col1")]);
            value.setColum2(data[mapping.get("Col2")]);
            list.add(value);
        }

        System.out.println(list);
    }

    @Data
    public static class MyBean {
        private String colum1;
        private String colum2;
    }
}
zed5wv10

zed5wv102#

下面是一个小例子:

public class Main {
    public static void main(String[] args) {
        CSVReader csvReader = new CSVReader(new StringReader(
                """
                        Col1, Col2
                        aa, bb
                        cc, dd
                        """));
        CsvToBean<MyBean> parser = new CsvToBeanBuilder<MyBean>(csvReader)
                .withType(MyBean.class).build();
        List<MyBean> beans = parser.parse();

        System.out.println(beans);
    }
    
    @Data
    public static class MyBean {
        @CsvBindByName(column = "Col1")
        private String colum1;
        @CsvBindByName(column = "Col2")
        private String colum2;
    }
}

以下是必需的依赖关系:

<dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>5.5</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>

Lombock是可选的。您可以按照自己的方式创建Bean。

相关问题