From 8af6459341ae45aee0deacb2e3a2235a45ce81ec Mon Sep 17 00:00:00 2001
From: Tim Molter <tim.molter@gmail.com>
Date: Fri, 7 Jun 2013 14:57:19 +0200
Subject: [PATCH] CSV import and export with errors bars

---
 xchart-demo/CSV/CSVChartColumns/series1.csv   |  6 ++--
 .../CSV/CSVChartColumnsExport/series1.csv     |  6 ++--
 xchart-demo/CSV/CSVChartRows/series1.csv      |  1 +
 .../CSV/CSVChartRowsExport/series1.csv        |  1 +
 .../java/com/xeiam/xchart/CSVExporter.java    | 32 ++++++++++++++++---
 .../java/com/xeiam/xchart/CSVImporter.java    | 30 +++++++++++++----
 6 files changed, 58 insertions(+), 18 deletions(-)

diff --git a/xchart-demo/CSV/CSVChartColumns/series1.csv b/xchart-demo/CSV/CSVChartColumns/series1.csv
index e7ff3f30..9c886265 100644
--- a/xchart-demo/CSV/CSVChartColumns/series1.csv
+++ b/xchart-demo/CSV/CSVChartColumns/series1.csv
@@ -1,3 +1,3 @@
-1,12
-2,34
-3,56
\ No newline at end of file
+1,12,4
+2,34,12
+3,56,21
\ No newline at end of file
diff --git a/xchart-demo/CSV/CSVChartColumnsExport/series1.csv b/xchart-demo/CSV/CSVChartColumnsExport/series1.csv
index d530da1c..73e712d7 100644
--- a/xchart-demo/CSV/CSVChartColumnsExport/series1.csv
+++ b/xchart-demo/CSV/CSVChartColumnsExport/series1.csv
@@ -1,3 +1,3 @@
-1,12
-2,34
-3,56
+1,12,4,
+2,34,12,
+3,56,21,
diff --git a/xchart-demo/CSV/CSVChartRows/series1.csv b/xchart-demo/CSV/CSVChartRows/series1.csv
index f53406c0..c77030a1 100644
--- a/xchart-demo/CSV/CSVChartRows/series1.csv
+++ b/xchart-demo/CSV/CSVChartRows/series1.csv
@@ -1,2 +1,3 @@
 1,2,3
 12,34,56
+4,12,21
\ No newline at end of file
diff --git a/xchart-demo/CSV/CSVChartRowsExport/series1.csv b/xchart-demo/CSV/CSVChartRowsExport/series1.csv
index f53406c0..7a37b37b 100644
--- a/xchart-demo/CSV/CSVChartRowsExport/series1.csv
+++ b/xchart-demo/CSV/CSVChartRowsExport/series1.csv
@@ -1,2 +1,3 @@
 1,2,3
 12,34,56
+4,12,21
diff --git a/xchart/src/main/java/com/xeiam/xchart/CSVExporter.java b/xchart/src/main/java/com/xeiam/xchart/CSVExporter.java
index d29c1fb2..463f7fd9 100644
--- a/xchart/src/main/java/com/xeiam/xchart/CSVExporter.java
+++ b/xchart/src/main/java/com/xeiam/xchart/CSVExporter.java
@@ -49,6 +49,10 @@ public class CSVExporter {
       out.write(csv);
       csv = join(series.getyData(), ",") + System.getProperty("line.separator");
       out.write(csv);
+      if (series.getErrorBars() != null) {
+        csv = join(series.getErrorBars(), ",") + System.getProperty("line.separator");
+        out.write(csv);
+      }
 
     } catch (Exception e) {
       e.printStackTrace();
@@ -78,14 +82,32 @@ public class CSVExporter {
 
       out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newFile), "UTF8"));
       Collection<?> xData = series.getxData();
-      Collection<?> yData = series.getyData();
+      Collection<Number> yData = series.getyData();
+      Collection<Number> errorBarData = series.getErrorBars();
       Iterator<?> itrx = xData.iterator();
-      Iterator<?> itry = yData.iterator();
+      Iterator<Number> itry = yData.iterator();
+      Iterator<Number> itrErrorBar = null;
+      if (errorBarData != null) {
+        itrErrorBar = errorBarData.iterator();
+      }
       while (itrx.hasNext()) {
         Number xDataPoint = (Number) itrx.next();
-        Number yDataPoint = (Number) itry.next();
-        String csv = xDataPoint + "," + yDataPoint + System.getProperty("line.separator");
-        out.write(csv);
+        Number yDataPoint = itry.next();
+        Number errorBarValue = null;
+        if (itrErrorBar != null) {
+          errorBarValue = itrErrorBar.next();
+        }
+        StringBuilder sb = new StringBuilder();
+        sb.append(xDataPoint + ",");
+        sb.append(yDataPoint + ",");
+        if (errorBarValue != null) {
+          sb.append(errorBarValue + ",");
+        }
+        sb.append(System.getProperty("line.separator"));
+
+        // String csv = xDataPoint + "," + yDataPoint + errorBarValue == null ? "" : ("," + errorBarValue) + System.getProperty("line.separator");
+        // String csv = + yDataPoint + System.getProperty("line.separator");
+        out.write(sb.toString());
       }
 
     } catch (Exception e) {
diff --git a/xchart/src/main/java/com/xeiam/xchart/CSVImporter.java b/xchart/src/main/java/com/xeiam/xchart/CSVImporter.java
index 38804f75..6f718025 100644
--- a/xchart/src/main/java/com/xeiam/xchart/CSVImporter.java
+++ b/xchart/src/main/java/com/xeiam/xchart/CSVImporter.java
@@ -70,7 +70,13 @@ public class CSVImporter {
       else {
         xAndYData = getSeriesDataFromCSVColumns(csvFile);
       }
-      chart.addSeries(csvFile.getName().substring(0, csvFile.getName().indexOf(".csv")), getAxisData(xAndYData[0]), getAxisData(xAndYData[1]));
+
+      if (xAndYData[2] == null || xAndYData[2].trim().equalsIgnoreCase("")) {
+        chart.addSeries(csvFile.getName().substring(0, csvFile.getName().indexOf(".csv")), getAxisData(xAndYData[0]), getAxisData(xAndYData[1]));
+      }
+      else {
+        chart.addSeries(csvFile.getName().substring(0, csvFile.getName().indexOf(".csv")), getAxisData(xAndYData[0]), getAxisData(xAndYData[1]), getAxisData(xAndYData[2]));
+      }
     }
 
     return chart;
@@ -96,7 +102,7 @@ public class CSVImporter {
    */
   private static String[] getSeriesDataFromCSVRows(File csvFile) {
 
-    String[] xAndYData = new String[2];
+    String[] xAndYData = new String[3];
 
     BufferedReader bufferedReader = null;
     try {
@@ -127,9 +133,10 @@ public class CSVImporter {
    */
   private static String[] getSeriesDataFromCSVColumns(File csvFile) {
 
-    String[] xAndYData = new String[2];
+    String[] xAndYData = new String[3];
     xAndYData[0] = "";
     xAndYData[1] = "";
+    xAndYData[2] = "";
 
     BufferedReader bufferedReader = null;
     try {
@@ -137,8 +144,12 @@ public class CSVImporter {
       String line = null;
       bufferedReader = new BufferedReader(new FileReader(csvFile));
       while ((line = bufferedReader.readLine()) != null) {
-        xAndYData[0] += line.split(",")[0] + ",";
-        xAndYData[1] += line.split(",")[1] + ",";
+        String[] dataArray = line.split(",");
+        xAndYData[0] += dataArray[0] + ",";
+        xAndYData[1] += dataArray[1] + ",";
+        if (dataArray.length > 2) {
+          xAndYData[2] += dataArray[2] + ",";
+        }
       }
 
     } catch (Exception e) {
@@ -165,8 +176,13 @@ public class CSVImporter {
     String[] stringDataArray = stringData.split(",");
     for (int i = 0; i < stringDataArray.length; i++) {
       String dataPoint = stringDataArray[i];
-      BigDecimal value = new BigDecimal(dataPoint);
-      axisData.add(value);
+      try {
+        BigDecimal value = new BigDecimal(dataPoint);
+        axisData.add(value);
+      } catch (NumberFormatException e) {
+        System.out.println("Error parsing >" + dataPoint + "< !");
+        throw (e);
+      }
     }
     return axisData;
   }
-- 
GitLab