[英]Java converting csv file to java object(relevant to generic type)
我尝试编写将csv文件转换为java对象的程序。我有很多csv文件和类。我不想为每个csv-class对编写不同的方法。我写了一个方法,但我不喜欢它(因为我是通用类型的新手)请提供有效解决方案的建议。感谢您的关注。
主要:
CsvParser<Person> parser = new CsvParser();
LinkedList<Person> a = parser.readCsv(chooser.getSelectedFile(),Person.class);
CsvParser:
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]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.