簡體   English   中英

Java將csv文件轉換為java對象(與通用類型有關)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM