/** * Convert data in CSV (comma separated value) format to a javascript array. * * Values are separated by a comma, or by a custom one character delimeter. * Rows are separated by a new-line character. * * Leading and trailing spaces and tabs are ignored. * Values may optionally be enclosed by double quotes. * Values containing a special character (comma's, double-quotes, or new-lines) * must be enclosed by double-quotes. * Embedded double-quotes must be represented by a pair of consecutive * double-quotes. * * Example usage: * var csv = '"x", "y", "z"\n12.3, 2.3, 8.7\n4.5, 1.2, -5.6\n'; * var array = csv2array(csv); * * Author: Jos de Jong, 2010 * * @param {string} data The data in CSV format. * @param {string} delimeter [optional] a custom delimeter. Comma ',' by default * The Delimeter must be a single character. * @return {Array} array A two dimensional array containing the data * @throw {String} error The method throws an error when there is an * error in the provided data. */ function csv2array(data, delimeter) { // Retrieve the delimeter if (delimeter == undefined) delimeter = ','; if (delimeter && delimeter.length > 1) delimeter = ','; // initialize variables var newline = '\n'; var eof = ''; var i = 0; var c = data.charAt(i); var row = 0; var col = 0; var array = new Array(); while (c != eof) { // skip whitespaces while (c == ' ' || c == '\t' || c == '\r') { c = data.charAt(++i); // read next char } // get value var value = ""; if (c == '\"') { // value enclosed by double-quotes c = data.charAt(++i); do { if (c != '\"') { // read a regular character and go to the next character value += c; c = data.charAt(++i); } if (c == '\"') { // check for escaped double-quote var cnext = data.charAt(i+1); if (cnext == '\"') { // this is an escaped double-quote. // Add a double-quote to the value, and move two characters ahead. value += '\"'; i += 2; c = data.charAt(i); } } } while (c != eof && c != '\"'); if (c == eof) { throw "Unexpected end of data, double-quote expected"; } c = data.charAt(++i); } else { // value without quotes while (c != eof && c != delimeter && c!= newline && c != ' ' && c != '\t' && c != '\r') { value += c; c = data.charAt(++i); } } // add the value to the array if (array.length <= row) array.push(new Array()); array[row].push(value); // skip whitespaces while (c == ' ' || c == '\t' || c == '\r') { c = data.charAt(++i); } // go to the next row or column if (c == delimeter) { // to the next column col++; } else if (c == newline) { // to the next row col = 0; row++; } else if (c != eof) { // unexpected character throw "Delimiter expected after character " + i; } // go to the next character c = data.charAt(++i); } return array; }