Created
October 11, 2012 17:15
-
-
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)
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
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