2013-12-10 68 views
1

我遇到了supercsv庫,它似乎是一個非常好的作品。 但是我有一個問題,我無法用他們網站提供的文檔來回答,想知道這裏有沒有人可以提供幫助。取決於多列的SuperCSV Cellprocessor

基本上我有一個csv文件,只有當另一列設置爲特定值時纔會出現該列。 因此,一個例子是以下幾點:

IsBirthDate,出生日期

是11/05/1985

沒有

是12/01/1999年

沒有

你看我什麼意思。有沒有一種方法來創建一個cellprocessor,可以採取這種依賴關係考慮在內,這樣當連續發現拋出一個異常:

號,12/09/1968年

乾杯

+0

您的CSV文件實際上是否有像您提供的示例那樣的可變列?或者每個No行後面都有一個尾隨的','? –

+0

它沒有。因此,「否」行實際上是「否」。也想說我需要做很多低級別的異常處理,並提供定製的詳細報告,說明爲什麼一個文件不解析,因此我決定手動編寫解析csv文件所需的類。圖書館supercsv仍然看起來不錯。 –

回答

1

看起來這已經回答了有關超級CSV論壇: http://sourceforge.net/p/supercsv/feature-requests/25/#30a5

複製的情況下,鏈接後出現故障:

我想你'詢問您是否可以驗證項目是否有 parentPartNumber,但跳過對產品的驗證。這基本上是交叉驗證(涉及多於1 列的驗證)。

我能想到的與細胞來實現這一 處理器的唯一方法是編寫檢查在另一列中的值 定製的Cell處理器,並決定基於價值什麼。每個 單元處理器都可以訪問CsvContext,其中包含原始的 (未處理)值。

所以你可以寫一個處理器,如下面的 。如果給定列 (其中列號從1開始)中的值等於其預期值,則其行爲與Optional相同。否則,它只是委託給鏈中的下一個處理器。

package example; 

import java.util.List; 

import org.supercsv.cellprocessor.Optional; 
import org.supercsv.cellprocessor.ift.CellProcessor; 
import org.supercsv.util.CsvContext; 

public class OptionalIfOtherColumnEquals extends Optional { 

    private final int column; 

    private final Object constantValue; 

    public OptionalIfOtherColumnEquals(int column, 
            Object constantValue) { 
    super(); 
    this.column = column; 
    this.constantValue = constantValue; 
    } 

    public OptionalIfOtherColumnEquals(int column, 
            Object constantValue, 
            CellProcessor next) { 
    super(next); 
    this.column = column; 
    this.constantValue = constantValue; 
    } 

    @Override 
    public Object execute(Object value, CsvContext context) { 

    // unprocessed row 
    List<Object> row = context.getRowSource(); 

    // optional if other column matches value 
    if (row.get(column - 1).equals(constantValue)){ 
     return super.execute(value, context); 
    } 

    // otherwise continue to next processor 
    return next.execute(value, context); 
    } 

} 

我取代了parentPartNumber列 新OptionalIfOtherColumnEquals(2, 「產品」,新 IsValueIn(partNumbers)),它適用於產品和項目處理器的定義,但它 驗證失敗在文件末尾的軟件包中。

我會離開 作爲一個練習爲你解決,但是你可以看到你可以通過 實現交叉驗證,如果你真的需要的話。希望這可以幫助。