我尝试编写提供将 csv 文件转换为 java 对象的程序。我有很多 csv 文件和类。我不想为每个 csv 类对编写不同的方法。我写了一个方法,但我没有'喜欢它(因为我是泛型的新手)请提供有效解决方案的建议。感谢您的关注。
主要内容:
CsvParser<Person> parser = new CsvParser();
LinkedList<Person> a = parser.readCsv(chooser.getSelectedFile(),Person.class);
Csv 解析器:
public class CsvParser<T> {
public LinkedList<T> readCsv(File file, Class<T> t) {
String[] columnNames = null;
LinkedList<T> result = new LinkedList<>();
try {
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
boolean isColumnNames = true;
while ((line = reader.readLine()) != null) {
String[] attributes = line.split("\\|");
if (isColumnNames) {
columnNames = attributes;
isColumnNames = false;
} else {
T newInstance = t.newInstance();
Field[] fields = t.getDeclaredFields();
for (Field field : fields) {
for (int i = 0; i < columnNames.length; i++) {
if (field.getName().equalsIgnoreCase(columnNames[i])) {
field.setAccessible(true);
field.set(newInstance, attribute[i]);
}
}
}
result.add(newInstance);
}
}
} catch (InstantiationException ex) {
Logger.getLogger(CsvParser.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(CsvParser.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (FileNotFoundException ex) {
Logger.getLogger(CsvParser.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(CsvParser.class.getName()).log(Level.SEVERE, null, ex);
}
return result;
}
}
csv 文件是这样的:(分隔符是“|”)
BusinessEntityID|PersonType|Title|FirstName|MiddleName|LastName|ModifiedDate
1|EM||Ken|J|Sánchez|1999-02-08 00:00:00
2|EM||Terri|Lee|Duffy|1998-02-24 00:00:00
3|EM||Roberto||Tamburello|1997-12-05 00:00:00
4|EM||Rob||Walters|1997-12-29 00:00:00
getdeclaredfields 参数不能不区分大小写。Person 类有一个属性 businessEntitiyId
但 csv 有 BusinessEntityID
所以我必须写这样的代码部分 :(
Field[] fields = t.getDeclaredFields();
for (Field field : fields) {
for (int i = 0; i < columnNames.length; i++) {
if (field.getName().equalsIgnoreCase(columnNames[i])) {
field.setAccessible(true);
field.set(newInstance, attribute[i]);
}
}
}
最佳答案
我猜你想用你刚刚读取的行的值设置字段,而不是列的名称:
field.set(newInstance, attributes[i]);
关于Java将csv文件转为java对象(泛型相关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20304769/