From 7f11baac0ebc258a6b343865407708ec80d59493 Mon Sep 17 00:00:00 2001
From: Aaron <aaronquinlan@gmail.com>
Date: Sun, 4 Jul 2010 01:35:22 -0400
Subject: [PATCH] Fixed bug in groupBy and added logic to enforce that strings
 are numeric when asking for nueric ops.

---
 src/groupBy/groupBy.cpp | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/groupBy/groupBy.cpp b/src/groupBy/groupBy.cpp
index ba4e31c4..6d6809f7 100755
--- a/src/groupBy/groupBy.cpp
+++ b/src/groupBy/groupBy.cpp
@@ -10,12 +10,12 @@
   Licenced under the GNU General Public License 2.0+ license.
 ******************************************************************************/
 #include <vector>
-#include <map>
 #include <numeric>
 #include <iterator>
 #include <iostream>
 #include <iomanip>
 #include <fstream>
+#include <sstream>
 #include <stdlib.h>
 #include <math.h>
 
@@ -36,6 +36,7 @@ void ShowHelp(void);
 void GroupBy(const string &inFile, const vector<int> &groupColumns, int opColumn, string op);
 void ReportSummary(const vector<string> &group, const vector<string> &data, string op);
 float ToFloat (string element);
+double ToDouble(const string &element);
 void TabPrint (string element);
 void CommaPrint (string element);
             
@@ -232,8 +233,6 @@ void GroupBy(const string &inFile, const vector<int> &groupColumns, int opColumn
 	    }
     }
     // report the last group
-    values.clear();
-    values.push_back(inFields[opColumn-1].c_str());
     ReportSummary(currGroup, values, op);
     
     _tab->Close();
@@ -241,9 +240,13 @@ void GroupBy(const string &inFile, const vector<int> &groupColumns, int opColumn
 
 
 void ReportSummary(const vector<string> &group, const vector<string> &data, string op) {
+    
     vector<double> dataF;
-    // convert to floats
-    transform(data.begin(), data.end(), back_inserter(dataF), ToFloat);
+    // are we doing a numeric conversion?  if so, convert the strings to doubles.
+    if ((op == "sum") || (op == "max") || (op == "min") || (op == "mean") ||
+	    (op == "median") || (op == "stdev")) {
+            transform(data.begin(), data.end(), back_inserter(dataF), ToDouble);
+    }
     
     if (op == "sum") {        
         // sum them up
@@ -353,3 +356,13 @@ void TabPrint (string element) {
 void CommaPrint (string element) {
     cout << element << ",";
 }
+
+double ToDouble(const string &element) {
+    std::istringstream i(element);
+    double x;
+    if (!(i >> x)) {
+        cerr << "Error: Could not properly convert string to numeric (\"" + element + "\")" << endl;
+        exit(1);
+    }
+    return x;
+}
-- 
GitLab