diff --git a/src/main/java/net/berack/upo/valpre/sim/stats/CsvResult.java b/src/main/java/net/berack/upo/valpre/sim/stats/CsvResult.java index 1d99c99..18e3041 100644 --- a/src/main/java/net/berack/upo/valpre/sim/stats/CsvResult.java +++ b/src/main/java/net/berack/upo/valpre/sim/stats/CsvResult.java @@ -9,7 +9,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Scanner; -import java.util.concurrent.atomic.AtomicInteger; /** * This class is used to save the results of the simulation to a CSV file. @@ -75,8 +74,7 @@ public class CsvResult { public static List loadResults(InputStream input) { var results = new ArrayList(); try (var scan = new Scanner(input)) { - var _ = scan.nextLine(); - + var headerOrder = CsvResult.extractHeaderPositions(scan.nextLine()); var nodes = new HashMap(); var seed = 0L; @@ -92,7 +90,7 @@ public class CsvResult { seed = currentSeed; var copy = Arrays.copyOfRange(line, 2, line.length); - var stats = CsvResult.statsFromCSV(copy); + var stats = CsvResult.statsFromCSV(headerOrder, copy); nodes.put(node, stats); } @@ -124,11 +122,50 @@ public class CsvResult { * @param values the values to convert * @return the statistics object */ - public static NodeStats statsFromCSV(String[] values) { - var i = new AtomicInteger(0); - var stats = new NodeStats(); - stats.apply(_ -> Double.parseDouble(values[i.getAndIncrement()])); - return stats; + public static NodeStats statsFromCSV(String[] header, String[] values) { + try { + var stats = new NodeStats(); + var clazz = NodeStats.class; + + for (var i = 0; i < values.length; i++) { + var value = Double.parseDouble(values[i]); + var field = header[i]; + clazz.getField(field).setDouble(stats, value); + } + return stats; + } catch (Exception e) { + throw new IllegalArgumentException("Error while parsing the CSV file " + e.getMessage()); + } } + /** + * Extract the header order from the CSV file. + * + * @param header the header to extract + * @return the positions of the header + * @throws IllegalArgumentException if the header is not correct + */ + public static String[] extractHeaderPositions(String header) { + var splittedHeader = header.split(","); + + var headerSeed = splittedHeader[0].equals("seed"); + var headerNode = splittedHeader[1].equals("node"); + if (!headerSeed || !headerNode) + throw new IllegalArgumentException("CSV file doesn't have the node or seed header"); + + var allStats = NodeStats.getOrderOfApply(); + splittedHeader = Arrays.copyOfRange(splittedHeader, 2, splittedHeader.length); + if (splittedHeader.length > allStats.length) + throw new IllegalArgumentException("CSV file doesn't have the correct header [" + allStats + "]"); + + var order = new String[allStats.length]; + var stats = Arrays.asList(allStats); + for (var i = 0; i < splittedHeader.length; i++) { + var stat = splittedHeader[i]; + var index = stats.indexOf(stat); + order[i] = allStats[index]; + } + + return order; + } }