121 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * 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;
 | |
| }
 |