Skip to content

Instantly share code, notes, and snippets.

@Rich-Harris
Created October 11, 2012 17:15
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Rich-Harris/3874013 to your computer and use it in GitHub Desktop.
Save Rich-Harris/3874013 to your computer and use it in GitHub Desktop.
A bog standard JavaScript CSV parser. Putting it here so I don't need to keep rewriting it or remembering where I put the last one. Usage self-explanatory, will break if you throw weird shit at it (cells with newlines in them, that sort of thing)
CSVParser = function ( options ) {
var defaults, delimiter, rowDelimiter, qualifier, qualified, unqualified;
options = options || {};
defaults = {
delimiter: ',',
rowDelimiter: '\n',
qualifier: '"'
};
delimiter = options.delimiter || defaults.delimiter;
this._rowDelimiter = options.rowDelimiter || defaults.rowDelimiter;
qualifier = options.qualifier || defaults.qualifier;
qualified = qualifier + '([^' + qualifier + ']*)' + qualifier;
unqualified = '([^' + delimiter + ']*)';
this._pattern = new RegExp( '(?:' + qualified + '|' + unqualified + ')(?:' + delimiter + '|$)', 'g' );
};
CSVParser.prototype = {
parse: function ( data ) {
var rowStrings, rowString, numRows, rows = [], row, rowNum, match, cell;
rowStrings = data.split( this._rowDelimiter );
numRows = rowStrings.length;
for ( rowNum=0; rowNum<numRows; rowNum+=1 ) {
var i=0;
this._pattern.lastIndex = 0;
rowString = rowStrings[ rowNum ];
row = rows[ rowNum ] = [];
match = this._pattern.exec( rowString );
while ( match ) {
cell = match[1] || match[2];
row[ row.length ] = cell;
if ( this._pattern.lastIndex < rowString.length ) {
match = this._pattern.exec( rowString );
} else {
match = false;
}
}
}
return rows;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment