Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用超级CSV将列表写入CSV_Java_List_Supercsv - Fatal编程技术网

Java 如何使用超级CSV将列表写入CSV

Java 如何使用超级CSV将列表写入CSV,java,list,supercsv,Java,List,Supercsv,我相信我可能不得不用supercsv重做我正在做的事情,因为从长远来看可能会更容易,但是我愿意接受任何其他建议。我只是想写回一个csv文件,我有一个包含所有数据的列表,但是输出是这样的 Exception in thread "main" org.supercsv.exception.SuperCsvException: The number of columns to be processed (229326) must match the number of CellProcessors (

我相信我可能不得不用supercsv重做我正在做的事情,因为从长远来看可能会更容易,但是我愿意接受任何其他建议。我只是想写回一个csv文件,我有一个包含所有数据的列表,但是输出是这样的

Exception in thread "main" org.supercsv.exception.SuperCsvException: The number of columns to be processed (229326) must match the number of CellProcessors (8):
通过替换列表中的字符串,我成功地获得了我想要的输出,但是当它运行时,它会挂起,我相信这是由于我如何回写到csv,我不确定,除了不使用超级csv将其回写到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,
我的课程如下

"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):
包编写器;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入org.supercsv.cellprocessor.FmtDate;
导入org.supercsv.cellprocessor.ParseDouble;
导入org.supercsv.cellprocessor.ParseInt;
导入org.supercsv.cellprocessor.constraint.NotNull;
导入org.supercsv.cellprocessor.ift.cellprocessor;
导入org.supercsv.io.CsvListWriter;
导入org.supercsv.io.ICsvListWriter;
导入org.supercsv.prefs.CsvPreference;
公共类租赁声明编写器{
公共ArrayList rData;
私有列表csvData;
字符b=',';
public Rent语句编写器(ArrayList rentData){
rData=租金数据;
ICsvListWriter listWriter=null;
试一试{
listWriter=new CsvListWriter(new FileWriter(“rentl.csv”),CsvPreference.STANDARD_首选项);
CellProcessor[]处理器=新的CellProcessor[]{
新的ParseInt(),
新FmtDate(“日/月/年”)//
新的ParseDouble(),
新的ParseDouble(),
新的ParseDouble(),
新的ParseDouble(),
新的ParseDouble(),
新的ParseDouble(),
};
最终字符串[]头=新字符串[]{“\u num”,“End\u Date”,“bal\u val”,“rval”,“cval”,“bf\u 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(“\”,“,”,“\”);
/*
*替换
*.replaceAll(“,”\“\,\”)
*/
listWriter.writeHeader(标题);
写入(csvData、处理器);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
系统输出打印(e+“文件无法写入”);
}最后{
如果(listWriter!=null){
试一试{
listWriter.close();
}捕获(IOE异常){
e、 printStackTrace();
System.out.println(“列表编写器”);
}
}
}
}
字符串listToCsv(列表ListOfstring,字符分隔符){
StringBuilder sb=新的StringBuilder();
//几乎最后
对于(int i=0;i

我在这个语法中遗漏了什么,或者有没有更好的方法来完成这个任务

这个问题的答案就在于这个问题

要处理的列数(1)必须与 手机处理器(8):

实际上,一行中逗号分隔的数据数量比您最初告诉SuperCSV的数量还要多

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





}
这使得SuperCSV假设每行和每列预期只有8个值对应一个标题。若在行中传递更多的值,它不知道该值对应的是什么,所以它会抛出异常


提供如何定义可选/必填列。

有几个问题:

  • ParseInt
    ParseDouble
    分别用于将CSV字符串读入
    Integer
    Double
    。请参阅方便的表格,了解哪些单元处理器可用于读/写或两者兼用。如果需要,可以将它们保留为
    null
    ,超级CSV只需对每个对象调用
    toString()

  • 您得到的异常(1列/8个处理器)表明您希望有8列(即列表中的8个元素),但只有1列。您只将单个字符串传递到
    数组中。asList()
    -看起来您假设此方法实际上将字符串拆分为一个列表(它不会!)

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

  • 当您不进行任何替换时,输出是什么,即当您将
    rentData
    列表直接传递到
    listWriter.write()
    时会发生什么

  • 我建议您修复处理器设置(将
    ParseInt
    ParseDouble
    替换为
    null
    ),将
    rentData
    列表直接传递给Super CSV

    final String [] header = new String []{"_num", "End_Date", "bal_val","rval","cval","bf_val","aval","pval"};
    

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

    @猎犬虽然你可能是对的,但我自己无法让它按我想要的方式工作。我将列表更改为字符串类型,但仍然得到了[lorg supercsv]的废话,我决定退出超级csv,以防有人遇到这个问题,我发现这样做更容易。除了generate csv方法外,不需要构造函数中的内容

    listWriter.write(rentData, processors);
    
    包编写器;
    公共类租赁声明编写器{
    /*
    * 
    *问题是,超级csv的工作,每个条目将需要一个单独的列表
    */
    公共ArrayList rData;
    私人名单
    
    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
    
    }