Permalink
Browse files

Few bug tweaks. Incorporated a new parsing engine that accounts for q…

  • Loading branch information...
1 parent 8c0e26a commit 956ec2d04f524b722b3a531af0300717dbe017c7 Shan Carter committed Oct 24, 2010
Showing with 115 additions and 8 deletions.
  1. +111 −7 js/CSVParser.js
  2. +4 −1 js/converter.js
View
@@ -2,9 +2,9 @@
// CSVParser.js
// Mr-Data-Converter
//
-// Created by Shan Carter on 2010-10-18.
// Input CSV or Tab-delimited data and this will parse it into a Data Grid Javascript object
-//
+//
+// CSV Parsing Function from Ben Nadel, http://www.bennadel.com/blog/1504-Ask-Ben-Parsing-CSV-Strings-With-Javascript-Exec-Regular-Expression-Command.htm
var CSVParser = {
@@ -56,12 +56,24 @@ var CSVParser = {
RE = new RegExp(rowDelimiter + "+$", "gi");
input = input.replace(RE, "");
- var arr = input.split(rowDelimiter);
+ // var arr = input.split(rowDelimiter);
+ //
+ // for (var i=0; i < arr.length; i++) {
+ // dataArray.push(arr[i].split(columnDelimiter));
+ // };
- for (var i=0; i < arr.length; i++) {
- dataArray.push(arr[i].split(columnDelimiter));
- };
+ // dataArray = jQuery.csv(columnDelimiter)(input);
+ dataArray = this.CSVToArray(input, columnDelimiter);
+
+ //escape out any tabs or returns or new lines
+ for (var i = dataArray.length - 1; i >= 0; i--){
+ for (var j = dataArray[i].length - 1; j >= 0; j--){
+ dataArray[i][j] = dataArray[i][j].replace("\t", "\\t");
+ dataArray[i][j] = dataArray[i][j].replace("\n", "\\n");
+ dataArray[i][j] = dataArray[i][j].replace("\r", "\\r");
+ };
+ };
var headerNames = [];
@@ -148,7 +160,99 @@ var CSVParser = {
};
return out;
- }
+ },
+
+
+
+ //---------------------------------------
+ // UTIL
+ //---------------------------------------
+
+ // This Function from Ben Nadel, http://www.bennadel.com/blog/1504-Ask-Ben-Parsing-CSV-Strings-With-Javascript-Exec-Regular-Expression-Command.htm
+ // This will parse a delimited string into an array of
+ // arrays. The default delimiter is the comma, but this
+ // can be overriden in the second argument.
+ CSVToArray: function( strData, strDelimiter ){
+ // Check to see if the delimiter is defined. If not,
+ // then default to comma.
+ strDelimiter = (strDelimiter || ",");
+
+ // Create a regular expression to parse the CSV values.
+ var objPattern = new RegExp(
+ (
+ // Delimiters.
+ "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
+
+ // Quoted fields.
+ "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
+
+ // Standard fields.
+ "([^\"\\" + strDelimiter + "\\r\\n]*))"
+ ),
+ "gi"
+ );
+
+
+ // Create an array to hold our data. Give the array
+ // a default empty first row.
+ var arrData = [[]];
+
+ // Create an array to hold our individual pattern
+ // matching groups.
+ var arrMatches = null;
+
+
+ // Keep looping over the regular expression matches
+ // until we can no longer find a match.
+ while (arrMatches = objPattern.exec( strData )){
+
+ // Get the delimiter that was found.
+ var strMatchedDelimiter = arrMatches[ 1 ];
+
+ // Check to see if the given delimiter has a length
+ // (is not the start of string) and if it matches
+ // field delimiter. If id does not, then we know
+ // that this delimiter is a row delimiter.
+ if (
+ strMatchedDelimiter.length &&
+ (strMatchedDelimiter != strDelimiter)
+ ){
+
+ // Since we have reached a new row of data,
+ // add an empty row to our data array.
+ arrData.push( [] );
+
+ }
+
+
+ // Now that we have our delimiter out of the way,
+ // let's check to see which kind of value we
+ // captured (quoted or unquoted).
+ if (arrMatches[ 2 ]){
+
+ // We found a quoted value. When we capture
+ // this value, unescape any double quotes.
+ var strMatchedValue = arrMatches[ 2 ].replace(
+ new RegExp( "\"\"", "g" ),
+ "\""
+ );
+
+ } else {
+
+ // We found a non-quoted value.
+ var strMatchedValue = arrMatches[ 3 ];
+
+ }
+
+
+ // Now that we have our value string, let's add
+ // it to the data array.
+ arrData[ arrData.length - 1 ].push( strMatchedValue );
+ }
+
+ // Return the parsed data.
+ return( arrData );
+ }
View
@@ -97,6 +97,9 @@ DataConverter.prototype.create = function(w,h) {
// self.convert();
// });
+ this.outputTextArea.click(function(evt){this.select();console.log("click")});
+
+
$("#insertSample").bind('click',function(evt){
evt.preventDefault();
self.insertSampleData();
@@ -164,7 +167,7 @@ DataConverter.prototype.convert = function() {
DataConverter.prototype.insertSampleData = function() {
- this.inputTextArea.val("NAME\tVALUE\tCOLOR\tDATE\nAlan\t12\tblue\tSep. 25, 2009\nShan\t13\tgreen\tSep. 27, 2009\nJohn\t45\torange\tSep. 29, 2009\nMinna\t27\tteal\tSep. 30, 2009");
+ this.inputTextArea.val("NAME\tVALUE\tCOLOR\tDATE\nAlan\t12\tblue\tSep. 25, 2009\nShan\t13\t\"green\tblue\"\tSep. 27, 2009\nJohn\t45\torange\tSep. 29, 2009\nMinna\t27\tteal\tSep. 30, 2009");
}

0 comments on commit 956ec2d

Please sign in to comment.