Skip to content

Instantly share code, notes, and snippets.

@gpawlik
Last active August 26, 2016 20:30
Show Gist options
  • Save gpawlik/bafb6fdd187d0a27770db48ffb2fea43 to your computer and use it in GitHub Desktop.
Save gpawlik/bafb6fdd187d0a27770db48ffb2fea43 to your computer and use it in GitHub Desktop.
function parseComplexCSV(input, separator, quote) {
separator = separator || ',';
quote = quote || '"';
return input
.replace(new RegExp('\\'+quote+'\\'+quote,'g'), 'doubleQuoteFlag')
.split(quote)
.map(function(val, index) {
return index%2 ?
val.replace(new RegExp('doubleQuoteFlag','g'), quote) :
val.replace(new RegExp('\n','g'),'splitByMeFirst')
.replace(new RegExp('\\' + separator,'g'),'splitByMeSecond')
.replace(new RegExp('doubleQuoteFlag','g'), '');
})
.join('')
.split('splitByMeFirst')
.map(function(val) {
return val.split('splitByMeSecond');
});
}
@gpawlik
Copy link
Author

gpawlik commented Aug 25, 2016

Test cases:

describe("CSV Parser Test Cases", function() {
  it("should handle simple inputs", function() {
    var input = "1,2,3\n4,5,6";
    var output = [['1','2','3'],['4','5','6']];
    Test.assertSimilar(parseComplexCSV(input), output);
  });
  it("should handle quoted fields", function() {
    var input = "1,\"two was here\",3\n4,5,6";
    var output = [['1','two was here','3'],['4','5','6']];
    Test.assertSimilar(parseComplexCSV(input), output);
  });
  it("should handle leading and trailing spaces in quoted fields", function() {
    var input = "1,\" two \",3\n4,5,6";
    var output = [['1',' two ','3'],['4','5','6']];
    Test.assertSimilar(parseComplexCSV(input), output);
  });
  it("should handle separators in quoted fields", function() {
    var input = "1,\"hello, world\",3\n4,5,6";
    var output = [['1','hello, world','3'],['4','5','6']];
    Test.assertSimilar(parseComplexCSV(input), output);
  });
  it("should handle alternate separators", function() {
    var input = "1\t2\t3\n4\t5\t6";
    var output = [['1','2','3'],['4','5','6']];
    Test.assertSimilar(parseComplexCSV(input, '\t'), output);
  });
  it("should handle empty rows", function() {
    var input = "1,\"two was here\",3\n\n4,5,6";
    var output = [['1','2','3'],[''],['4','5','6']];
    Test.assertSimilar(parseComplexCSV(input), output);
  });
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment