2016-07-31 28 views
4

私は、csvファイルの行をJavaオブジェクトに変換するためにUNIVOCITY-PARSERSを使用しています。UNIVOCITY-PARSERSエラーが発生すると直ちにBeanオブジェクトを停止します。

ファイルを処理中に、行内の列に問題が発生した場合、その行で解析が停止され、例外がスローされます。しかし、私はエラーがある行をスキップするだけでファイルの終わりまで続ける何かが必要です。しかし、私はAPIのユーティリティクラスはありませんでした。

MY Beanクラス

public class ItemcodeBean { 

@Trim 
@NullString(nulls = { " ", "" }) 
@Parsed(field = "ItemCode") 
private String itemCode; 

@Trim 
@NullString(nulls = { " ", "" }) 
@Parsed(field = "PartNumber") 
private String partNumber; 

@Trim 
@NullString(nulls = { " ", "" }) 
@Parsed(field = "ModelNumber") 
private String modelNumber; 

} 

私のメインクラス

パブリッククラスTestClassを{

private BeanListProcessor<ItemcodeBean> 
     rowProcessor = null; 
private CsvParser parser = null; 
public static void main(String[] args) { 
    TestClass testClass = new TestClass(); 
    testClass.init(); 
    try{ 
     ItemcodeBean itemcodeBean; 
     while ((itemcodeBean = testClass.getRowData()) != null){ 
      System.out.println(itemcodeBean.toString()); 
     } 
    }catch (Throwable ex){ 
     System.out.println(ex.getLocalizedMessage()); 
    } 

} 

private BeanListProcessor<ItemcodeBean> init() { 
    // BeanListProcessor converts each parsed row to an instance of a given class, then stores each instance into a list. 
      this.rowProcessor = 
      new BeanListProcessor<ItemcodeBean>(ItemcodeBean.class); 

    CsvParserSettings parserSettings = new CsvParserSettings(); 
    parserSettings.setProcessor(rowProcessor); 
    parserSettings.setHeaderExtractionEnabled(true); 
    // skip leading whitespaces 
    parserSettings.setIgnoreLeadingWhitespaces(true); 

    //skip trailing whitespaces 
    parserSettings.setIgnoreTrailingWhitespaces(true); 
    //skip empty lines 
    parserSettings.setSkipEmptyLines(true); 

    File file = new File("C:\\Users\\abhishyam.c\\Downloads\\Itemcode_Template.csv"); 
    this.parser = new CsvParser(parserSettings); 
    //parser.parse(file); 
    parser.beginParsing(file); 
    return rowProcessor; 
} 

private ItemcodeBean getRowData() throws Throwable { 
    String[] row; 
    try { 
     while ((row = parser.parseNext()) != null){ 
      return rowProcessor.createBean(row, parser.getContext()); 
     } 
    }catch (DataProcessingException e){ 
     throw new DataProcessingException(e.getColumnName(),e); 
    } 
    // parser.stopParsing(); 
    return null; 
} 

}

答えて

2

ちょうどエラーハンドラを使用して、それはあなたが投げていない限り続けるだろうあなた自身例外:

//Let's set a RowProcessorErrorHandler to log the error. The parser will keep running. 
    settings.setProcessorErrorHandler(new RowProcessorErrorHandler() { 
     @Override 
     public void handleError(DataProcessingException error, Object[] inputRow, ParsingContext context) { 
      println(out, "Error processing row: " + Arrays.toString(inputRow)); 
      println(out, "Error details: column '" + error.getColumnName() + "' (index " + error.getColumnIndex() + ") has value '" + inputRow[error.getColumnIndex()] + "'"); 
     } 
    }); 

更新:代わりにRetryableErrorHandlerを使用すると、行が破棄されないようにすることができます。これは、バージョン2.3.0に追加された特別な実装で、問題のある列に値を代入するためにsetDefaultValue()メソッドを呼び出し、レコードが破棄されないようにkeepRecordを呼び出すことができます。

例:error.getColumnIndex() -1を返した場合、そこにレコードを保存するために行うことができます何もない、そしてそれは関係なく、スキップされますことを

settings.setProcessorErrorHandler(new RetryableErrorHandler<ParsingContext>() { 
    @Override 
    public void handleError(DataProcessingException error, Object[] inputRow, ParsingContext context) { 
     //if there's an error in the first column, assign 50 and proceed with the record. 
     if(error.getColumnIndex() == 0){ 
      setDefaultValue(50); 
     } else { //else keep the record anyway. Null will be used instead. 
      keepRecord(); 
     } 
    } 
}); 

注意。これを使用して、エラーの詳細を記録できます。

+0

すぐに返信いただきありがとうございます。なぜ列のエラーが見つかるとすぐに行の処理が停止しているのかを知りたいのですが、行末まで処理してその行のすべてのエラーを返すのはなぜですか? – Abhishyam

+0

エラーを処理する方が簡単で簡単です。問題のある行を全体として処理し、各列の各エラーを例外オブジェクトに格納するためのユースケースはかなり制限されています。 –

+0

@JeronimoBackes:情報をありがとう。これも私のために働いた。しかし私は別の問題に直面しています。 エラーを記録中に、以前のBeanもリストに再挿入されます。 'CsvParserSettings parserSettings = getCsvParserSettings(); CsvRoutinesルーチン=新しいCsvRoutines(parserSettings); for(情報bean:ルーチン.iterate(Info.class、getReader(file.getAbsolutePath())){ infoList.add(bean); \t \t \t \t log.info( "ID:" + bean.getId()+ "、名前:" + bean.getName()); } ' どうすれば制御できますか?それをリストに追加する際に例外があるかどうかを確認するためのハンドラ参照はありますか? – Maverick

関連する問題