对于一个项目,我需要处理CSV文件,但在运行时不知道列数。这些CSV文件是完全有效的,我只需要对几个不同的文件执行简单的任务。我需要分析列的值,因此需要使用用于处理CSV文件的库。为了简单起见,假设我需要做一些简单的事情,比如向所有文件追加日期列,无论它们有多少列。我想使用Super CSV来完成这个任务,因为我也在其他任务中使用这个库。
我遇到的问题更多的是概念性问题。如果我事先不知道有多少列,我不确定应该如何处理文件。如果我不知道文件中有哪些列以及有多少列,我不确定应该如何定义映射任意CSV文件的POJOs或如何定义Cell Processors。我如何动态创建与列数匹配的Cell processors?例如,我如何基于CSV文件的标题定义POJOs?
考虑这样一种情况:我有两个CSV文件:products.csv和address.csv。假设我想为这两个文件都添加一个带有今天日期的日期列,而不必编写两个不同的方法(例如addDateColumnToProduct()和addDateColumnToAddress()),它们执行相同的操作。
我遇到的问题更多的是概念性问题。如果我事先不知道有多少列,我不确定应该如何处理文件。如果我不知道文件中有哪些列以及有多少列,我不确定应该如何定义映射任意CSV文件的POJOs或如何定义Cell Processors。我如何动态创建与列数匹配的Cell processors?例如,我如何基于CSV文件的标题定义POJOs?
考虑这样一种情况:我有两个CSV文件:products.csv和address.csv。假设我想为这两个文件都添加一个带有今天日期的日期列,而不必编写两个不同的方法(例如addDateColumnToProduct()和addDateColumnToAddress()),它们执行相同的操作。
product.csv:
name, description, price
"Apple", "red apple from Italy","2.5€"
"Orange", "orange from Spain","3€"
address.csv:
firstname, lastname
"John", "Doe"
"Coole", "Piet"
根据CSV文件的标题信息,我该如何定义一个映射产品CSV的POJO?同样的问题也适用于Cell Processors吗?我该如何定义一个非常简单的Cell Processor,它只有正确数量的构造函数参数,例如针对product.csv?
CellProcessor[] processor = new CellProcessor[] {
null,
null,
null
};
并且对于 address.csv 文件:
CellProcessor[] processor = new CellProcessor[] {
null,
null
};
这是否可能?我是不是走错了路来实现这个目标?
编辑 1: 我不是在寻找一个能够处理单个文件中具有可变列的 CSV 文件的解决方案。我试图弄清楚在运行时是否可以处理任意 CSV 文件,即是否可以仅基于 CSV 文件中包含的标题信息创建 POJOs,在不知道 csv 文件将有多少列的情况下。
解决方案: 根据 @baba 的回答和评论
private static void readWithCsvListReader() throws Exception {
ICsvListReader listReader = null;
try {
listReader = new CsvListReader(new FileReader(fileName), CsvPreference.TAB_PREFERENCE);
listReader.getHeader(true); // skip the header (can't be used with CsvListReader)
int amountOfColumns=listReader.length();
CellProcessor[] processor = new CellProcessor[amountOfColumns];
List<Object> customerList;
while( (customerList = listReader.read(processor)) != null ) {
System.out.println(String.format("lineNo=%s, rowNo=%s, customerList=%s", listReader.getLineNumber(),
listReader.getRowNumber(), customerList));
}
}
finally {
if( listReader != null ) {
listReader.close();
}
}
}
for(int i=0; i< properties.size(); i++){
..你的回答中有一个拼写错误,看起来可以满足要求。 - Sid