简体   繁体   English

Java将csv文件转换为java对象(与通用类型有关)

[英]Java converting csv file to java object(relevant to generic type)

I try to write program which provide converting csv file to java object.I have a lot of csv files and classes.I don't want to write different method for each csv-class pair.I wrote one method but I didn't like it(Because I am new to generic type) please give an advise for efficient solution.Thanks for your attention. 我尝试编写将csv文件转换为java对象的程序。我有很多csv文件和类。我不想为每个csv-class对编写不同的方法。我写了一个方法,但我不喜欢它(因为我是通用类型的新手)请提供有效解决方案的建议。感谢您的关注。

Main : 主要:

CsvParser<Person> parser =  new CsvParser();
LinkedList<Person> a = parser.readCsv(chooser.getSelectedFile(),Person.class);

CsvParser : 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 file is like that : (separator is "|") 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 parameters cannot be case insensitive.Person class has an attribute businessEntitiyId but csv has BusinessEntityID So i must write the part of code like that :( 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