我有一个大问题。我想将CSV文件映射到我的实体。这应该动态发生。我从前端获取文件和用户映射。它包含headerColumn,类和属性。这将通过JSONArray进行迭代。所以我不知道该类,因为也许用户告诉他希望将headerColumn“ abc”设置为Article.articleName,但在同一CSV中将headerColumn“ def”设置为Competitor.location。

我的尝试:

     List<Class> classes = new ArrayList<>();
     for (int i = 0; i < jsonArray.length(); i++) {

         Class<?> cls = Class.forName(pathToEntities + jsonArray.getJSONObject(i).get(classKey).toString());
         maps.put(cls, columnMapping);
     }

     for (int i = 0; i < classes.size(); i++) {
         Class cls = classes.get(i);
         CsvToBean<cls> csvToBean = new CsvToBean<cls>();

         columnMapping.put("LANGU", "id");
         columnMapping.put("TXTMD", "fname");
         columnMapping.put("Lname", "lname");

         HeaderColumnNameTranslateMappingStrategy<cls> strategy = new HeaderColumnNameTranslateMappingStrategy<cls>();
         strategy.setType(cls);
         strategy.setColumnMapping(columnMapping);
     }


我希望你能跟随我。对于每个类,我都希望运行整个映射过程。然后将columnMapping映射提供给此类。但是编译器无法使用它,并告诉我何时给CsvToBean一个变量而不是一个类:cls cannot be resolved to a type

该库在这里是OpenCSV。但是我真的不在乎要使用哪个CSV库。我只是想让它工作。无论如何,我都会实施它们中的每一个。现在,这似乎对我来说无法解决。

最佳答案

您可以尝试使用instanceof检查从Class.forName()获得的实体

        CSVReader csvReader = new CSVReader(new FileReader("Simple.csv"));
        Class aClass = Class.forName("com.ishikawa.csvparser.entity.SimpleEntity");
        CsvToBean ctb = new CsvToBean();
        HashMap<String, String> columnMapping = new HashMap<>();

        HeaderColumnNameTranslateMappingStrategy headerStrategy = new HeaderColumnNameTranslateMappingStrategy();

        columnMapping.put("LANGU", "name");
        headerStrategy.setType(aClass);
        headerStrategy.setColumnMapping(columnMapping);

        ctb.setMappingStrategy(headerStrategy);
        ctb.setCsvReader(csvReader);



        List parse = ctb.parse();
        parse.stream().forEach(e->{
            if (e instanceof SimpleEntity) {
                System.out.println(((SimpleEntity)e).getName());
            }
        });


与simple.csv

LANGU
asd
asdf


以实体为例

package com.ishikawa.csvparser.entity;

import lombok.Data;

@Data
public class SimpleEntity {

    public String name;
}


希望对您有帮助。

upd1
如果您需要更改分隔符并将创建的CSVParser实例添加到CSVReader

CSVParser parser = new CSVParserBuilder()
        .withSeparator(';')
        .withIgnoreQuotations(true)
        .build();

CSVReader csvReader = new CSVReaderBuilder(reader)
        .withSkipLines(0)
        .withCSVParser(parser)
        .build();

07-28 13:10