看起來這已經回答了有關超級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)),它適用於產品和項目處理器的定義,但它 驗證失敗在文件末尾的軟件包中。
我會離開 作爲一個練習爲你解決,但是你可以看到你可以通過 實現交叉驗證,如果你真的需要的話。希望這可以幫助。
您的CSV文件實際上是否有像您提供的示例那樣的可變列?或者每個No行後面都有一個尾隨的','? –
它沒有。因此,「否」行實際上是「否」。也想說我需要做很多低級別的異常處理,並提供定製的詳細報告,說明爲什麼一個文件不解析,因此我決定手動編寫解析csv文件所需的類。圖書館supercsv仍然看起來不錯。 –