我有一个大问题。我想将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();