我正在使用java泛型来读取CSV文件并创建相应的对象。我正在接受任何CSV文件并将其映射到一个类。
我的CSV中的第一行作为类名,然后我将读取剩余的行并为每一行构建一个对象。
我正在使用CSVReader来帮助我这样做。但是我收到了编译错误(我在代码中标记了它们)。
这是我的方法:
public String importFromCsvFile(File f) throws IOException, ClassNotFoundException
{
FileReader fr = new FileReader(f);
BufferedReader reader = new BufferedReader(fr);
String className = reader.readLine();
//Java reflection to get the Class Object.
Class BeanClass = Class.forName(className);
// Reader reader = new FileReader("persons.csv");
ValueProcessorProvider provider = new ValueProcessorProvider();
CSVEntryParser<BeanClass> entryParser = new AnnotationEntryParser<BeanClass>(BeanClass.class, provider); // BeanClass, cannot find symbol
CSVReader<BeanClass> csvPersonReader = new CSVReaderBuilder<BeanClass>(reader).entryParser(entryParser).build(); // BeanClass, cannot find symbol
List<BeanClass> beanClassList = csvPersonReader.readAll(); // BeanClass, cannot find symbol
System.out.println("First line: " + className);
return "";
}
我仍在构建我的方法,但是由于编译错误,我无法继续前进。有谁知道如何解决它们? 同样,BeanClass可以是我的任何数据类,因此它必须是通用的。
谢谢!
答案 0 :(得分:1)
您在编译时已知的静态类名称(如String
或ValueProcessorProvider
)与变量引用类相混淆,仅在运行时知道。如果您尊重Java命名约定,则更容易区分两者:类名称以upperccase latters开头,变量使用小写字母。所以代码应该是
FileReader fr = new FileReader(f);
BufferedReader reader = new BufferedReader(fr);
String className = reader.readLine();
//Java reflection to get the Class Object.
Class beanClass = Class.forName(className);
ValueProcessorProvider provider = new ValueProcessorProvider();
CSVEntryParser<beanClass> entryParser = new AnnotationEntryParser<beanClass>(beanClass.class, provider); // BeanClass, cannot find symbol
CSVReader<beanClass> csvPersonReader = new CSVReaderBuilder<beanClass>(reader).entryParser(entryParser).build(); // beanClass, cannot find symbol
List<beanClass> beanClassList = csvPersonReader.readAll(); // BeanClass, cannot find symbol
System.out.println("First line: " + className);
return "";
现在,您可以立即看到您正在使用变量beanClass
,只能使用在编译时已知的文字类名称:<>
之间必须具备的内容是一个文字类名,而不是变量,因为编译器使用它来确保类型安全。我没有检查下面的代码编译,但它应该比你的尝试更接近:
FileReader fr = new FileReader(f);
BufferedReader reader = new BufferedReader(fr);
String className = reader.readLine();
//Java reflection to get the Class Object.
Class<?> beanClass = Class.forName(className);
ValueProcessorProvider provider = new ValueProcessorProvider();
CSVEntryParser<?> entryParser = new AnnotationEntryParser<>(beanClass, provider);
CSVReader<?> csvPersonReader = new CSVReaderBuilder<>(reader).entryParser(entryParser).build();
List<?> beanClassList = csvPersonReader.readAll();
System.out.println("First line: " + className);
return "";
答案 1 :(得分:1)
在课堂上我认为BeanClass
不是真正的课程。如果某个类不存在,则编译器无法编译它。你应该提供你的类(bean)来使用。你应该实施
public class BeanClass {
@MapToColumn(column=0)
private String firstColumn;
请参阅http://code.google.com/p/jcsv/wiki/ValueProcessorExample。