[英]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.