我正在嘗試實作 DMN(決策模型和表示法)評估服務,用戶可以在其中上傳包含要評估的測驗用例的 csv 檔案,并接收結果作為輸入檔案中每個測驗用例的 csv 檔案。
讀取輸入 csv 檔案并評估測驗用例沒有問題。但是我在使用 OpenCsv 將結果寫入 csv 檔案時遇到了一些問題。
這是映射的 bean,應轉換為 csv 行:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DmnTestCaseResult {
private Map<String, Object> testInput;
private Map<String, Object> expectedOutput;
private List<Map<String, Object>> testOutput;
private String errorMessage;
}
正如您在此處看到的,測驗用例結果在某些情況下可以有多個 testOutput,定義為 map 串列。
我想要的是為 testOutput 中的每個地圖條目撰寫,在 csv 檔案中單獨一行。但是使用我在下面撰寫的代碼,只有 testOutput 的第一個條目被寫入 csv 檔案中的一行。
public String convertDmnRuleTestResultToCsv(DmnRuleTestResult result) {
List<DmnTestCaseResult> results = result.getTestCases();
try(StringWriter sw = new StringWriter(); CSVWriter writer = new CSVWriter(sw, CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END)) {
StatefulBeanToCsv<DmnTestCaseResult> beanToCsv = new StatefulBeanToCsvBuilder<DmnTestCaseResult>(writer)
.withApplyQuotesToAll(false)
.build();
beanToCsv.write(results);
return sw.toString();
} catch(Exception ex){
throw new CsvParseException(ex.getMessage());
}
}
我如何告訴 OpenCsv 它應該為 testOutputs 中的每個條目創建單獨的行?
編輯:添加了更多資訊
用戶界面:
導致不正確的 CSV:

預期正確的 CSV:

從截圖中可以看出,一個輸入可以有多個測驗輸出。因此,我想在 csv 檔案中為每個測驗輸出創建一個單獨的行。
uj5u.com熱心網友回復:
由于StatefulBeanToCsv似乎無法為單個 bean 生成多行,我建議實作自定義映射功能。這也需要您手動列印標題行。
public static String convertDmnRuleTestResultToCsv(DmnRuleTestResult result) {
List<DmnTestCaseResult> results = result.getTestCases();
try (StringWriter sw = new StringWriter();
CSVWriter writer = new CSVWriter(sw, CSVWriter.DEFAULT_SEPARATOR,
CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER,
CSVWriter.DEFAULT_LINE_END)) {
writeHeader(writer);
for (DmnTestCaseResult r : results) {
for (Map<String, Object> map : r.getTestOutput())
writer.writeNext(map(r, map));
}
return sw.toString();
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
}
private static void writeHeader(CSVWriter writer) {
List<String> header = new ArrayList<>();
header.add("ERRORMESSAGE");
header.add("EXPECTEDOUTPUT");
header.add("INPUT");
header.add("OUTPUT");
writer.writeNext(header.toArray(new String[] {}));
}
private static String[] map(DmnTestCaseResult r, Map<String, Object> testOutput) {
// you can manually adjust formats here as well; entrySet() call can be left out, it does change the format. do what you like more
List<String> line = new ArrayList<>();
line.add(r.getErrorMessage());
line.add(r.getExpectedOutput().entrySet().toString());
line.add(r.getTestInput().entrySet().toString());
line.add(testOutput.entrySet().toString());
return line.toArray(new String[] {});
}
這列印:
ERRORMESSAGE,EXPECTEDOUTPUT,INPUT,OUTPUT
errorMessage,[expectedOutput1=expectedOutput1, expectedOutput2=expectedOutput2],[input2=testInput2, input1=testInput1],[testOut2=testOut2, testOut=testOut1]
errorMessage,[expectedOutput1=expectedOutput1, expectedOutput2=expectedOutput2],[input2=testInput2, input1=testInput1],[testOut3=testOut3, testOut4=testOut4]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/489915.html
