将CSV文件解析为泛型类-Java泛型

将CSV文件解析为泛型类-Java泛型,java,generics,csv,Java,Generics,Csv,我正在尝试建立一个通用方法,将CSV文件解析为对象 我想我已经接近目标了,但是我有点被java泛型卡住了,我还在学习它 现在我被困在创建对象的while循环中。我正在使用它来为我进行解析。我正在学习他们的文档教程 我不知道如何设置beanClass bc=it.next()因为beanClass在我的项目中不作为类存在,编译错误:找不到符号-类beanClass 我怎样才能解决这个问题 我知道我可以简单地做一个List beanClassList=csvFileReader.readAll()

我正在尝试建立一个通用方法,将CSV文件解析为对象

我想我已经接近目标了,但是我有点被java泛型卡住了,我还在学习它

现在我被困在创建对象的while循环中。我正在使用它来为我进行解析。我正在学习他们的文档教程

我不知道如何设置
beanClass bc=it.next()因为
beanClass
在我的项目中不作为类存在,编译错误:
找不到符号-类beanClass
我怎样才能解决这个问题

我知道我可以简单地做一个
List beanClassList=csvFileReader.readAll()
但问题是,在每个CSV文件的第一行,我有数据所属的类名。我得到这个例外,这是有道理的:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "Car"
我的CSV文件如下所示:

ClassName
value,value,value,value,value
value,value,value,value,value
...
这是我的密码:

public String importFromCsvFile(File f) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException
    {
    FileReader fr = new FileReader(f);
    BufferedReader buffReader = new BufferedReader(fr);
    String className = buffReader.readLine();

    buffReader.close();

    //Java reflection to get the Class Object.
    Class beanClass = Class.forName("model." + className);

    Object beanObject = beanClass.newInstance();

    Reader reader = new FileReader(f);

    ValueProcessorProvider provider = new ValueProcessorProvider();
    CSVEntryParser<?> entryParser = new AnnotationEntryParser<>(beanClass, provider);
    CSVReader<?> csvFileReader= new CSVReaderBuilder<>(reader).entryParser((CSVEntryParser<Object>) entryParser).build();

    Iterator<?> it = csvFileReader.iterator();

    while (it.hasNext()) {

        beanClass bc = it.next(); // here is the compilation error

    }
}

根据您的评论,请查看从CSV文件读取数据并作为键值对存储在地图中的示例代码

List<Map<String, String>> list = new ArrayList<Map<String, String>>();

BufferedReader reader = new BufferedReader(new FileReader(new File("resources/abc.csv")));

String header = reader.readLine();
String[] keys = header.split(",");
String line = null;
while ((line = reader.readLine()) != null) {
    Map<String, String> map = new HashMap<String, String>();
    String[] values = line.split(",");
    for (int i = 0; i < keys.length; i++) {
        map.put(keys[i], values[i]);
    }
    list.add(map);
}

reader.close();

for(Map<String, String> map:list){
    for(String key:map.keySet()){
        System.out.println(key+":"+map.get(key));
    }
    System.out.println();
}

对于泛型,类型在编译时指定(并由编译器检查)。在您的情况下,类型仅在CSV文件中指定,因此在编译时未知。因此,在这种情况下,泛型不是可以使用的工具

你想用泛型实现什么?您希望编译器检查什么

您可以使用
class.forName(name).newInstance()
创建类的实例(需要包含包的全名),并使用反射设置一些属性。但在编译时,您只知道结果是一个
对象

public String importFromCsvFile(File f) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException
    {
    FileReader fr = new FileReader(f);
    BufferedReader buffReader = new BufferedReader(fr);
    String className = buffReader.readLine();

    buffReader.close(); // you can also not close it and use buffReader as your reader for the CSV

    //Java reflection to get the Class Object.
    Class beanClass = Class.forName("model." + className);

    Object beanObject = beanClass.newInstance(); // this is never needed

    Reader reader = new FileReader(f); // use buffReader instead of creating a new one

    ValueProcessorProvider provider = new ValueProcessorProvider();
    CSVEntryParser<?> entryParser = new AnnotationEntryParser<>(beanClass, provider);
    CSVReader<?> csvFileReader= new CSVReaderBuilder<>(reader).entryParser((CSVEntryParser<Object>) entryParser).build();

    Iterator<?> it = csvFileReader.iterator();

    while (it.hasNext()) {

        Object obj = it.next(); // obj is an instance of Car with your data
        boolean isCar = obj instanceof Car; // will be true
    }
}
public String importFromCsvFile(文件f)抛出IOException、ClassNotFoundException、instanceionexception、IllegalAccessException
{
FileReader fr=新的FileReader(f);
BufferedReader buffReader=新的BufferedReader(fr);
字符串className=buffReader.readLine();
buffReader.close();//您也不能关闭它并将buffReader用作CSV的读取器
//Java反射以获取类对象。
Class beanClass=Class.forName(“model.”+className);
Object beanObject=beanClass.newInstance();//这是不需要的
Reader Reader=newfilereader(f);//使用buffReader而不是创建新的文件读取器
ValueProcessorProvider提供程序=新的ValueProcessorProvider();
CSVEntryParser entryParser=新的AnnotationEntryParser(beanClass,provider);
CSVReader csvFileReader=新的CSVReaderBuilder(reader).entryParser((CSVEntryParser)entryParser.build();
Iterator it=csvFileReader.Iterator();
while(it.hasNext()){
Object obj=it.next();//obj是包含数据的Car实例
布尔值isCar=obj instanceof Car;//将为true
}
}

因为您使用的是<代码>,<代码>作为分隔符,您应该考虑使用<代码> UKIDEAUTION/COD>作为读者的策略或定义您自己的(默认分隔符是“代码>;< /代码>”)。


您还应该继续使用BufferedReader,或者在策略中指定
skipHeader
,否则您
Car
将被视为条目,这可能不是您想要的。

代码中缺少变量f和csvFileReader。我不希望CSV解析器除了吐出字符串之外做任何事情。您的问题可能是试图将字符串强制转换为类对象。@djb错误是:
找不到符号-Class beanClass
@Braj代码已更新,请检查我的更新问题。请阅读。您的应用程序中必须有一个类
beanClass
。如果最初创建,会出现什么问题?您不知道CSV文件的结构吗?谢谢!在
标题中
我有我的类名,现在如何创建此对象?它只会在运行时被知道,而不是在编译时,这是我的主要问题。你在说什么班名。它事先不存在于类路径中。您必须更改您的设计。:)你就是那个人!如果你住在隔壁,我会给你买瓶啤酒的!:)现在工作完美:)
ID,NAME,MODEL,YEAR,NUMBER
1,BMW,Z3,2000,20-AC-57
2,Mercedes,C4,2010,23-32-VJ
3,Alfa Romeo,A3,1992,XX-XX-XX
public String importFromCsvFile(File f) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException
    {
    FileReader fr = new FileReader(f);
    BufferedReader buffReader = new BufferedReader(fr);
    String className = buffReader.readLine();

    buffReader.close(); // you can also not close it and use buffReader as your reader for the CSV

    //Java reflection to get the Class Object.
    Class beanClass = Class.forName("model." + className);

    Object beanObject = beanClass.newInstance(); // this is never needed

    Reader reader = new FileReader(f); // use buffReader instead of creating a new one

    ValueProcessorProvider provider = new ValueProcessorProvider();
    CSVEntryParser<?> entryParser = new AnnotationEntryParser<>(beanClass, provider);
    CSVReader<?> csvFileReader= new CSVReaderBuilder<>(reader).entryParser((CSVEntryParser<Object>) entryParser).build();

    Iterator<?> it = csvFileReader.iterator();

    while (it.hasNext()) {

        Object obj = it.next(); // obj is an instance of Car with your data
        boolean isCar = obj instanceof Car; // will be true
    }
}