Skip to content

Instantly share code, notes, and snippets.

@tracend
Last active September 22, 2017 13:52
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save tracend/6011515 to your computer and use it in GitHub Desktop.
Save tracend/6011515 to your computer and use it in GitHub Desktop.
Underscore Mixin: CSVtoJSON - Converts an CSV to a JSON using the first row as keys. Based on CSVtoArray (https://gist.github.com/tracend/6004478) #underscore #js #cc
_.mixin({
// 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.
CSVtoJSON: function( strData, strDelimiter ){
// Check to see if the delimiter is defined. If not,
// then default to comma.
strDelimiter = (strDelimiter || ",");
// FIX: add an ending carriage return if missing
if( strData.substr(-1) !== "\n" ) strData += "\n";
// 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.
var jsonData = [];
// Create an array to hold our individual pattern
// matching groups.
var arrMatches = null;
var keys = [];
var row = [];
// 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.
var newRow = strMatchedDelimiter.length && (strMatchedDelimiter != strDelimiter);
if ( newRow ){
// first row is the keys
if(!keys.length){
keys = row;
} else {
// Since we have reached a new row of data,
// add an empty row to our data array.
// combine row with keys
var data = {};
for( var i in row){
data[ keys[i] ] = row[i];
}
jsonData.push( data );
}
// eighter way reset the row
row = [];
}
// 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.
row.push( strMatchedValue );
}
// Return the parsed data.
return( jsonData );
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment