java - 如何使用 Super CSV 将列表写入 CSV

标签 java list supercsv

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的方式造成的,我不确定,还有什么除了不使用 super 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):

我的witer类如下

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();
}





}

我在这个语法中缺少什么,或者有更好的方法来完成这个任务

最佳答案

有几个问题:

  1. ParseIntParseDouble用于读取 CSV 字符串到 IntegerDouble分别。请参阅方便的表格 here查看哪些单元处理器可用于读/写或两者。您可以留下它们null如果您愿意,Super CSV 将直接调用 toString()在每个对象上。

  2. 您收到的异常(1 列/8 个处理器)表明您期望有 8 列(即列表中的 8 个元素),但实际上只有 1 个。您只传递了一个单个字符串进入 Arrays.asList() - 看起来您假设此方法实际上将字符串拆分为列表(事实并非如此!)。

  3. 为什么要将租金数据列表转换为字符串?这实在是太奇怪了。如果您的数据需要任何操作(我不确定是否需要),那么您应该更新列表中的每个元素,而不是将整个列表转换为字符串,然后尝试再次将其拆分。

    <
  4. 当您不进行任何替换时,输出是什么,即当您通过 rentData 时会发生什么直接列出listWriter.write()

我可以建议您修复处理器设置(将 ParseIntParseDouble 替换为 null ),传递 rentData直接列出到 super CSV...

listWriter.write(rentData, processors);

...然后将结果(输出/堆栈跟踪)发布到您的问题中。

关于java - 如何使用 Super CSV 将列表写入 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18075490/

相关文章:

r - 按行相关,在数据框内

java - 异常后继续 SuperCSV 读取

java - 断言的替代方案

list - 在 QML 中滑动删除

Python将列表中的每个元素按 '\n'分割并将列表从2D扩展到3D

java - Supercsv 生成异常

java - 依赖于多列的 SuperCSV Cellprocessor

java - 在 Java 中使用不同的打印机打印 .PDF 文件

java - 启动cassandra的问题

Java hibernate 查询中 order by 子句的问题