2

@Carlo V. Dango質問を簡略化し、ドキュメントを読みました。慌てる必要はありません。それでも、私には問題があります。私が1つを解決するのを手伝ってください、そしてそれはそれらすべてを解決します。ありがとうございました。

質問:文字列以外のフィールドが欠落しているcsvレコードがある場合、欠落しているエントリをデフォルト値に変換する方法(または、少なくともNullPointerExceptionをスローしない方法)はありますか?オプションのcellProcessorも、エラーを防ぐために表示されません。

このプログラムは、基本的にSuperCSVWebサイトから取得したものです。

package com.test.csv;
import java.io.FileReader;

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.io.ICsvBeanReader;
import org.supercsv.prefs.CsvPreference;


public class CSVReader {

private static final CellProcessor[] cellProcessor = new CellProcessor[] {
    null,
    null,
    new ParseInt(),
    new ParseDate("yyyyMMdd"),      
    new ParseBigDecimal()       
};

public static void main (String[] args ) throws Exception {

    CsvPreference pref = new CsvPreference('"', '|', "\n");

    ICsvBeanReader inFile = new CsvBeanReader(new FileReader("C:\\temp\\sapfilePipe.txt"), pref);
    try {
        final String[] header = inFile.getCSVHeader(true);
        User user;
        while ((user = inFile.read(User.class, header, cellProcessor)) != null) {
            System.out.println(user);
        }
    } finally {
        inFile.close();
    }

}

}

これが私が読んでいるCSVファイルです。最初のレコードに欠落しているフィールド(年齢)があることに注意してください。

firstName|lastName|age|hireDate|hourlyRate
A.|Smith|  |20110101|15.50

マイユーザーBean:

package com.test.csv;

import java.math.BigDecimal;
import java.util.Date;

public class User {

private String firstName;
private String lastName;
private int age;
private Date hireDate;
private BigDecimal hourlyRate;
    ...getters/setters...   

エラーは次のとおりです。

Exception in thread "main" java.lang.NullPointerException
    at org.supercsv.io.CsvBeanReader.fillObject(Unknown Source)
    at org.supercsv.io.CsvBeanReader.read(Unknown Source)
    at com.glazers.csv.CSVReader.main(CSVReader.java:31)

ありがとう。

4

2 に答える 2

3

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

スーパーCSV2.0.0-beta-1がリリースされました。多くのバグ修正と新機能(ネストされたプロパティと配列/コレクションをマッピングするためのMavenサポートと新しいDozer拡張機能を含む)が含まれています。

""また、空の( )列の処理方法も変更されました。これらは、として読み取られるようになりましnullた。これは、BeanのfirstNameandlastNameフィールドが、CSVファイルに存在しない場合 nullの代わりに存在することを意味します。""

Optional()プロセッサはこれに対応するように更新されているため、引き続き同じように機能します。

私の使用の提案はTokenもはや関係ありません:ConvertNullTo代わりに使用する必要があります:

new ConvertNullTo(-1, new ParseInt())

本当に必要なのはCellProcessorです。これは、列が空でない場合にのみ、チェーン内の次のプロセッサーの実行を許可しますOptional

したがって、CellProcessor配列を次のように更新します。

private static final CellProcessor[] cellProcessor = new CellProcessor[] {
    null,
    null,
    new Optional(new ParseInt()),
    new ParseDate("yyyyMMdd"),      
    new ParseBigDecimal()       
};

このようにParseIntすると、列が空白でない場合(CellProcessorsは左から右に実行されます)にのみ実行され、Beanのintフィールドはデフォルト値の0のままになります。

フィールドを-1に設定して値が指定されていないことを示す場合は、Tokenプロセッサを使用できます。プロセッサは、任意のトークン(この場合は "")を目的の値に置き換え、他の入力には次のように処理します。次のプロセッサ。すなわち

new Token("", -1, new ParseInt())

@Carlo V. Dango CsvListReaderは非常に原始的な実装であるため(Beanにマップする機能が失われます)、迅速でダーティな解析にのみ使用します。

そしてnull、それ以上の処理を必要としない文字列プロパティの配列(読み取り時)でのみ使用することをお勧めします。

ちなみに、私は次のリリースに向けて作業しているスーパーCSVプロジェクトに取り組んでいます。私がそれにいる間、私はウェブサイトのコード例を必ず改善するでしょう;)

于 2012-02-12T12:59:36.820 に答える
1

リストリーダーは、各行を文字列のリストに読み込みます。これがあなたが探しているもののようです。

http://super-csv.github.io/super-csv/apidocs/org/supercsv/io/CsvListReader.html

または、ここhttp://super-csv.github.io/super-csv/examples_reading.htmlに示すように、特定の処理を実行したくない場合は、プロセッサをnullに設定できます。

于 2011-11-28T12:06:44.077 に答える