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





}

この構文に欠けているもの、またはこのタスクを実行するためのより良い方法はありますか

4

3 に答える 3

1

いくつかの問題があります:

  1. ParseIntおよびは、 CSV 文字列をそれぞれおよびに読み込むParseDoubleために使用されます。読み取り/書き込み、またはその両方に使用できるセル プロセッサについては、こちらの便利な表を参照してください。必要に応じてそれらを残すことができ、Super CSV は各オブジェクトを呼び出すだけです。IntegerDoublenulltoString()

  2. Arrays.asList()取得している例外 (1 列/8 プロセッサ) は、8 つの列 (つまり、リストに 8 つの要素) があることを期待していることを示していますが、1 つしかありません。このメソッドが実際に文字列をリストに分割すると仮定しています (そうではありません!)。

  3. 賃貸データのリストを文字列に変換するのはなぜですか? それは本当に奇妙です。データの操作が必要な場合 (必要かどうかはわかりません)、リスト全体を文字列に変換してから再度分割するのではなく、リスト内の各要素を更新する必要があります。

  4. 置換を行わない場合の出力は何ですか?つまり、rentDataリストを に直接渡すとどうなりlistWriter.write()ますか?

プロセッサの設定を修正して ( と を に置き換えてParseInt) ParseDoublenullリストrentDataを Super CSV に直接渡すことをお勧めします...

listWriter.write(rentData, processors);

...次に、結果 (出力/スタックトレース) を質問に投稿します。

于 2013-08-06T22:39:26.610 に答える
0

@ハウンドドッグあなたはおそらく正しかったのですが、自分で望んでいたように機能させることができませんでした。リストを文字列型に変更しましたが、まだ [lorg supercsv] がらくたを取得していました。誰かがこの問題に遭遇した場合に備えて、スーパー 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

}

}

于 2013-08-16T12:46:35.913 に答える
0

この質問に対する解決策は、質問にあります。

処理される列の数 (1) は、CellProcessors の数 (8) と一致する必要があります。

実際には、最初に SuperCSV に伝えたよりも多くのカンマ区切りデータが連続して表示されています。

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

これにより、SuperCSV は、1 つのヘッダーに対応する各行および各列に期待される値の数は 8 つだけであると想定します。行にさらに値を渡すと、その値が何に対応するのかがわからないため、例外がスローされます。

このリンクは、オプション/必須の列を定義する方法を提供します。

于 2013-08-06T08:49:57.243 に答える