2

@Carl V. Dango、@Zsolt、@Jon、最初からやり直しましょう。これが私のコードとエラーです(一番下)。コンソール出力に生データの最初の 2 行が表示されます。最初の行 ("item") の最初のフィールドは、出力では null です。その列に StrReplace(" ","xx") をコーディングしたので、'xx' にすべきだと思いました。私のより大きな懸念は、3 番目のレコードの 4 列目に null/空白をトラップする方法です。これらはとても基本的なことのように思えるので、解決するのにこれほどの手間がかかることに少しがっかりしています。

package com.mycompany.data.transfers.app;

import java.io.FileReader;

import org.supercsv.cellprocessor.ConvertNullTo;
import org.supercsv.cellprocessor.ParseBigDecimal;
import org.supercsv.cellprocessor.ParseDate;
import org.supercsv.cellprocessor.ParseInt;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvBeanReader;
import org.supercsv.prefs.CsvPreference;

import com.mycompany.data.transfers.models.Invoice;

public class Test {

/**
 * @param args
 * @throws Exception 
 */
public static void main(String[] args) throws Exception {

    char quote = '"';
    int delimeter = 124;
    String newLine = "\n";

    CellProcessor[] cp = new CellProcessor[] { 
            new StrReplace(" ", "xx"),
            null,
            new ParseDate("yyyyMMdd"), 
            new ParseBigDecimal(),
            new ConvertNullTo("0", new ParseBigDecimal()),
            new ParseDate("yyyyMMdd"), 
            null,
            new ParseDate("yyyyMMdd"), 
            null,
            null,
            null,
            null,
            null,
            new ParseInt() 
        };

    Invoice bean = new Invoice();

    CsvBeanReader inFile = new CsvBeanReader(new FileReader("c:\\temp\\my_test_file.txt"), new CsvPreference(quote, delimeter, newLine));

    while ((bean = inFile.read(bean.getClass(), new String[] {"item", "loc", "schedDate", "fracQty", "recQty",
        "expDate", "poNum", "dateShip", "masterLoadId", "loadId",
        "confirmationNumber", "sourceWarehouse", "purchasingGroup",
        "poDistFlag" }, cp)) != null) {
        System.out.println(bean);
    }
}

}

Invoice [item=, loc=NEW, schedDate=Wed Nov 02 00:00:00 CDT 2011, fracQty=5, recQty=4]
Invoice [item=0006268410, loc=SHR, schedDate=Thu Nov 03 00:00:00 CDT 2011, fracQty=12, recQty=5]
Exception in thread "main" null
Parser error context: Line: 3 Column: 4 Raw line:
[0000939515, NEW, 20111102, 50, , 20111102, , 20111102, 0000000000, 0000000000, , , BBA, 1]
 offending processor: org.supercsv.cellprocessor.ParseBigDecimal@17a8913
at org.supercsv.cellprocessor.ParseBigDecimal.execute(Unknown Source)
at org.supercsv.cellprocessor.ConvertNullTo.execute(Unknown Source)
at org.supercsv.util.Util.processStringList(Unknown Source)
at org.supercsv.io.CsvBeanReader.read(Unknown Source)
at com.mycompany.data.transfers.app.Test.main(Test.java:48)
Caused by: java.lang.NumberFormatException
at java.math.BigDecimal.<init>(BigDecimal.java:534)
at java.math.BigDecimal.<init>(BigDecimal.java:728)
... 5 more
4

1 に答える 1

2

ここでのこの問題はCsvBeanReader、空の列をに変換するのではなくnull""(空の文字列)に変換することです。したがって、 CSVファイルを書き込むときに本当に必要なのはConvertNullToプロセッサだけです。

だから代わりに

new ConvertNullTo("0", new ParseBigDecimal())

あなたが使用する必要があります

new Token("", "0", new ParseBigDecimal()) // replace "" with "0"

これは、空白の列に値がゼロのBigDecimalが必要であると想定しています。null代わりに、BigDecimalを使用する場合は、

new Optional(new ParseBigDecimal())

サイトとjavadocでこれをより明確にする必要があることを認めます。これは、SuperCSVの次のリリースで取り組んでいることです。


編集:スーパーCSV2.0.0-beta-1の更新

最近リリースされたSuperCSV2.0.0-beta-1には、多くのバグ修正と新機能(Mavenサポート、ネストされたプロパティと配列/コレクションをマッピングするための新しいDozer拡張機能を含む)が含まれています。また、nullと空の文字列の処理も変更されました。

新しいバージョン""は(空の列)をとして読み取りnullます。これは、元のコードを使用できることを意味します。

new ConvertNullTo("0", new ParseBigDecimal())

この結果、セルプロセッサはではなくとOptional()一致するようになりました。これは、書き込み時にセルプロセッサとしても使用できることを意味します(値はとして書き込まれるようになります)。null""null""

于 2012-02-13T21:52:13.763 に答える