CSV to Array

Convert data in CSV (comma separated value) format to a javascript array.

Columns are separated by a comma or a custom delimeter. Rows are separated by a new line character "\n". Values can be enclosed by single quotes ' or double quotes ". Inside a quoted value, the escape character \ can be used.

Note that this code can be easily ported to C++, Java, or your own favorite programming language.

Author: Jos de Jong, 2010

Try it yourself

Sourcecode

You can download the sourcecode from here, or by copying the following code.

/**
 * Convert data in CSV (comma separated value) format to a javascript array.
 * Columns are separated by a comma or a custom delimeter.
 * Rows are separated by a new line character "\n".
 *
 * Values can be enclosed by single quotes ' or double quotes ".
 * Inside a quoted value, the escape character \ can be used.
 *
 * 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
 */ 
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();
  
  /**
   * Set the pointer to the next character
   */ 
  var next = function() {
    c = data.charAt(++i);
  }
  
  while (c != eof) {
    // skip whitespaces
    while (c == ' ' || c == '\t') {
      next();
    }
    
    // get value
    var value = "";
    if (c == '\'') {
      // value enclosed by single quotes
      next();
      while (c != eof && c != '\'') {
        // check for escape character
        if (c == '\\')
          next();
          
        value += c;
        next();
      }      
      next();
    } 
    else if (c == '\"') {
      // value enclosed by double quotes
      next();
      while (c != eof && c != '\"') {
        // check for escape character
        if (c == '\\')
          next();

        value += c;
        next();
      }      
      next();      
    }
    else {
      // value without quotes
      while (c != eof && c != delimeter && c!= newline && c != ' ' && c != '\t') {
        value += c;
        next();
      }
    }

    // add the value to the array
    if (array.length <= row) 
      array.push(new Array());
    array[row].push(value);
    
    // skip whitespaces
    while (c == ' ' || c == '\t') {
      next();
    }

    // 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 {
      // eof reached
    }
    next();
  }  
  
  return array;
}