Last active
February 18, 2020 09:52
-
-
Save gotoken/cc5ad1ab2dcb43857ff20ba338233a97 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment