Java将csv文件转为java对象(泛型相关)

标签 java reflection

我尝试编写提供将 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/

相关文章:

java - PKIX 路径构建失败 sun.security.provider.certpath.SunCertPathBuilderException

c# - 从类名创建实例

Java动态创建实例变量的对象数组

java - 如何使用类名动态设置 ArrayList 类型?

c# - EntityFrameworkCore 有没有一种方法可以创建 EnumToStringConverter 而无需将枚举类型作为通用类型传递?

reflection - 如何在 Java 内部使用 Java 9 的反射?

Java 应用程序未在 Eclipse Galileo 中运行

java - 如何在 Spring TaskExecutor 中进行重试

java - 带有 Netty 和 WebFlux 的 ChannelOperation 终端堆栈

java - Google App Engine Java 错误