在superCSV中同时使用CSVListReader和CSVBeanreader
我想读取不同的CSV文件,这些文件都有一个固定的列号,但两个不同的文件有两个不同的列号。所有文件都有一条标题线。 因此,我首先使用CSVListReader获取标题和列号,然后构建单元处理器和CSV BeanReader,将实际行映射到POJO。 我首先尝试将InputStreamReaders传递给superCsv readers构造函数,但没有成功。但是,可以与文件读取器或BufferedReader配合使用。 在这种情况下使用InputStremReader是一个bug还是没有意义 下面是工作代码示例在superCSV中同时使用CSVListReader和CSVBeanreader,csv,supercsv,Csv,Supercsv,我想读取不同的CSV文件,这些文件都有一个固定的列号,但两个不同的文件有两个不同的列号。所有文件都有一条标题线。 因此,我首先使用CSVListReader获取标题和列号,然后构建单元处理器和CSV BeanReader,将实际行映射到POJO。 我首先尝试将InputStreamReaders传递给superCsv readers构造函数,但没有成功。但是,可以与文件读取器或BufferedReader配合使用。 在这种情况下使用InputStremReader是一个bug还是没有意义 下面是
CsvListReader listReader = null;
FileReader file = null;
BufferedReader b = null;
try {
file = new FileReader(linkToFile);
b = new BufferedReader(file);
listReader = new CsvListReader(b,
CsvPreference.STANDARD_PREFERENCE);
csvHeader = listReader.getHeader(true);
} catch (IOException e) {
logger.info("Did not manage to get the Csv Header", e);
try {
listReader.close();
file.close();
} catch (IOException e1) {
logger.info("Problem trying to close the readers", e1);
return;
}
}
try {
file = new FileReader(linkToFile);
b = new BufferedReader(file);
beanReader = new CsvBeanReader(b,
CsvPreference.STANDARD_PREFERENCE);
beanReader.getHeader(false);
extractCSV(beanReader, csvHeader);
catch (IOException e) {
logger.info("Did not manage to get a working CsvBeanReader.", e);
try {
beanReader.close();
listReader.close();
file.close();
} catch (IOException e1) {
logger.info("Problem trying to close the readers", e1);
}
return;
}
提前感谢根据Hound Doc的评论,造成混乱的原因在于关闭不同读者的管理不善。 下面是使用输入流读取器的工作代码
// Reading the Header. A CsvListReader object is used here as it can
// read a variable number of columns in the first line (see
// http://supercsv.sourceforge.net/readers.html)
CsvListReader listReader = null;
InputStreamReader b = null;
try {
b = new InputStreamReader(new BufferedInputStream(new FileInputStream(linkToFile)));
listReader = new CsvListReader(b, CsvPreference.STANDARD_PREFERENCE);
csvHeader = listReader.getHeader(true);
} catch (IOException e) {
logger.info("Did not manage to get the Csv Header", e);
} finally {
try {
listReader.close();
} catch (IOException e1) {
logger.info("Problem trying to close the readers", e1);
return;
}
}
// Using the CSV bean reader to read the file. Now we know the number of
// columns
// A CsvBeanReader object is the choice to extract easier to POJO
// structure
CsvBeanReader beanReader = null;
try {
b = new InputStreamReader(new BufferedInputStream(new FileInputStream(linkToFile)));
beanReader = new CsvBeanReader(b, CsvPreference.STANDARD_PREFERENCE);
// beanReader starts reading from line 2 (see above)
// it is as if we would be reading a file without a header
beanReader.getHeader(false);
extractCSVContacts(beanReader, csvHeader);
} catch (IOException e) {
logger.info("Did not manage to get a working CsvBeanReader.", e);
return;
}
finally {
try {
beanReader.close();
} catch (IOException e1) {
logger.info("Problem trying to close the readers", e1);
}
}
你必须用stacktrace更新你的答案——很难说出“它不起作用”是什么意思。还有一些附带问题:1。您只需要关闭CsvReader(它将关闭底层流)。2.我不知道为什么不能只使用CsvBeanReader——文件之间唯一不同的是cell处理器,对吗?因此,您应该能够根据页眉大小将不同的处理器传递给
beanReader.read()
。查看您关于副作用的评论,我意识到在使用InputStreamReaders时我在关闭时出错,这就是为什么CSVBeanReader实际上无法从文件中读取任何内容的原因。Evreything现在运行良好,是的,您是对的,从2个文件更改的唯一内容是处理器,这些处理器是根据CSVListReader读取的头的结果动态构建的。谢谢,酷。我忘了提到,您需要在finally
块中关闭阅读器,而不仅仅是在出现异常时。