[英]How to write a list to CSV with Super CSV
Exception in thread "main" org.supercsv.exception.SuperCsvException: The number of columns to be processed (229326) must match the number of CellProcessors (8):
我相信我可能不得不重做我使用supercsv所做的事情,因为从长远来看,它可能会更容易,但是我可以接受任何其他建议。 我只想写回一个csv文件,我有一个包含所有数据的列表,但是输出是这样的
4350 02/06/2013 3965.21 0.0 0.0 0.0 0.0 0.0,
4698 02/06/2013 498.16 0.0 0.0 0.0 0.0 0.0,
4992 02/06/2013 97.87 87.82 6.05 0.0 0.0 0.0,
4441 02/06/2013 18.8 71.98 11.6 0.0 0.0 -42.5, 54092 02/06/2013 105.11 118.82 6.24 0.0 0.0 0.0,
我已经设法通过替换列表中的字符串来获得所需的输出,但是当它运行时它挂起了,我相信它是由于我正在写回csv的方式,我不确定,还有什么可以做的而不是不使用超级csv而将其写回csv。 我得到的错误是
"1805","31/07/2013","-233.4","0.0","0.0","0.0","0.0","0.0"
"8054","31/07/2013","280.45","82.38","52.38","0.0","0.0","-200.0"The number of columns to be processed (1) must match the number of CellProcessors (8):
我的机子如下
package writer;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.supercsv.cellprocessor.FmtDate;
import org.supercsv.cellprocessor.ParseDouble;
import org.supercsv.cellprocessor.ParseInt;
import org.supercsv.cellprocessor.constraint.NotNull;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvListWriter;
import org.supercsv.io.ICsvListWriter;
import org.supercsv.prefs.CsvPreference;
public class RentStatementsWriter {
public ArrayList rData;
private List<String> csvData;
char b = ',';
public RentStatementsWriter(ArrayList rentData) {
rData = rentData;
ICsvListWriter listWriter = null;
try{
listWriter = new CsvListWriter(new FileWriter("rentl.csv"),CsvPreference.STANDARD_PREFERENCE);
CellProcessor[] processors =new CellProcessor[]{
new ParseInt(),
new FmtDate("dd/MM/yyyy"),//
new ParseDouble(),
new ParseDouble(),
new ParseDouble(),
new ParseDouble(),
new ParseDouble(),
new ParseDouble(),
};
final String [] header = new String []{"_num", "End_Date", "bal_val","rval","cval","bf_val","aval","pval"};
System.out.print("to string "+rData.toString().replaceFirst(" ", "\"").replaceAll("\\,"," \\,").replaceAll(" ", "").replaceAll(" ", "\"\\,\"").replaceAll("\"\\,\"\\,", "\"\n\""));
csvData = Arrays.asList(rData.toString().replaceFirst(" ", "\"").replaceAll("\\,"," \\,").replaceAll(" ", "").replaceAll(" ", "\"\\,\"").replaceAll("\"\\,\"\\,", "\"\""));
/*
* replace
* .replaceAll(" ", "\"\\,\"")
*/
listWriter.writeHeader(header);
listWriter.write(csvData, processors);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.print(e+" file unable to write");
} finally {
if(listWriter !=null){
try {
listWriter.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("list writer");
}
}
}
}
String listToCsv(List<String> listOfStrings, char separator) {
StringBuilder sb = new StringBuilder();
// all but last
for(int i = 0; i < listOfStrings.size() - 1 ; i++) {
sb.append("\""+listOfStrings.get(i)+"\"");
sb.append(separator);
}
// last string, no separator
sb.append(listOfStrings.get(listOfStrings.size()-1));
return sb.toString();
}
}
我在此语法中缺少什么,或者有更好的方法来完成此任务
有两个问题:
ParseInt
和ParseDouble
分别用于将CSV字符串读取为Integer
和Double
。 请参阅此处的方便使用的表格,以了解哪些单元处理器可用于读取/写入或同时用于两者。 您可以根据需要将它们保留为null
,Super CSV只会在每个对象上调用toString()
。
您得到的异常(1列/ 8个处理器)表明您期望有8列(即List中的8个元素),但只有1列。您仅将单个String传递给Arrays.asList()
-似乎您在假设此方法实际上将String拆分为一个List(不是!)。
为什么将租金数据列表转换为字符串? 真是奇怪。 如果您的数据需要任何操作(我不确定是否需要),那么您应该更新列表中的每个元素,而不是将整个列表转换为字符串,然后尝试再次将其拆分。
不进行任何替换时的输出是什么,即当将rentData
列表直接传递给listWriter.write()
时会发生什么?
我可以建议您修复处理器设置(用null
代替ParseInt
和ParseDouble
),将rentData
List直接传递给Super CSV ...
listWriter.write(rentData, processors);
...然后将结果(输出/堆栈跟踪)发布到您的问题。
这个问题的解决方案在于问题。
要处理的列数(1)必须与CellProcessors的数目(8)相匹配:
实际上,您连续使用逗号分隔的数据要比最初告诉SuperCSV的数据多。
final String [] header = new String []{"_num", "End_Date", "bal_val","rval","cval","bf_val","aval","pval"};
这使SuperCSV假定每一行和每一列仅预期有8个数值对应一个标题。 如果您在行中传递更多值,它将不知道该值对应于什么,因此将引发Exception。
该链接为您提供了如何定义可选/强制列。
@猎犬虽然你可能是对的,但我无法按照我自己想要的方式工作。 我将列表更改为字符串类型,并且很讨厌得到[lorg supercsv]废话,我只是决定退出super csv,以防万一有人遇到这样的问题,我发现这很容易。 除了generate csv方法之外,不需要构造函数中的内容
package writer;
public class RentStatementsWriter {
/*
*
* problem being that for super csv to work each entry will need a seperate list
*/
public ArrayList<RentStatements> rData;
private List<String> csvData;
char b = ',';
public RentStatementsWriter(ArrayList rentData) {
rData = rentData;
csvData = new ArrayList<String>();
try{
generateCsvFile("renttest.csv", rentData,b);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.print(e+" file unable to write");
} finally {
if(listWriter !=null){
try {
listWriter.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("list writer");
}
}
}
}
private void generateCsvFile(String fileName, ArrayList rentData, char b2) {
try{
final String [] header = new String []{"tncy_num", "End_Date", "bal_val","rent_val","chg_val","benf_val","adj_val","pay_val"};
FileWriter writer = new FileWriter(fileName);
writer.append("tncy_num");
writer.append(',');
writer.append("End_Date");
writer.append(',');
writer.append("bal_val");
writer.append(',');
writer.append("rent_val");
writer.append(',');
writer.append("chg_val");
writer.append(',');
writer.append("benf_val");
writer.append(',');
writer.append("adj_val");
writer.append(',');
writer.append("pay_val");
writer.append('\n');
for(int i = 0;i <rentData.size();i++){
String line = rentData.get(i).toString();
String bits []=line.split(" ");//splits each space into diffrent bits
//string something = bits.get waleva the it is surround it by ""
writer.append(bits[1]);
writer.append(b2);
writer.append(bits[2]);
writer.append(b2);
writer.append(bits[3]);
writer.append(b2);
writer.append(bits[4]);
writer.append(b2);
writer.append(bits[5]);
writer.append(b2);
writer.append(bits[6]);
writer.append(b2);
writer.append(bits[7]);
writer.append(b2);
writer.append(bits[8]);
writer.append('\n');
}
writer.flush();
writer.close();
}catch(IOException e)
{
e.printStackTrace();
}
// TODO Auto-generated method stub
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.