diff --git a/lib/string.js b/lib/string.js index fc6fe31..d2a7518 100644 --- a/lib/string.js +++ b/lib/string.js @@ -259,7 +259,7 @@ string.js - Copyright (C) 2012-2014, JP Richardson if (typeof qualifier == 'undefined') qualifier = '"'; - var i = 0, fieldBuffer = [], fields = [], len = this.s.length, inField = false, self = this; + var i = 0, fieldBuffer = [], fields = [], len = this.s.length, inField = false, inUnqualifiedString = false, self = this; var ca = function(i){return self.s.charAt(i)}; if (typeof lineDelimiter !== 'undefined') var rows = []; @@ -270,17 +270,21 @@ string.js - Copyright (C) 2012-2014, JP Richardson var current = ca(i); switch (current) { case escape: - //fix for issues #32 and #35 - if (inField && ((escape !== qualifier) || ca(i+1) === qualifier)) { + //fix for issues #32 and #35 + if (inField && ((escape !== qualifier) || ca(i+1) === qualifier)) { i += 1; fieldBuffer.push(ca(i)); break; - } - if (escape !== qualifier) break; + } + if (escape !== qualifier) break; case qualifier: inField = !inField; break; case delimiter: + if(inUnqualifiedString) { + inField=false; + inUnqualifiedString=false; + } if (inField && qualifier) fieldBuffer.push(current); else { @@ -289,20 +293,37 @@ string.js - Copyright (C) 2012-2014, JP Richardson } break; case lineDelimiter: - if (inField) { - fieldBuffer.push(current); + if(inUnqualifiedString) { + inField=false; + inUnqualifiedString=false; + fields.push(fieldBuffer.join('')) + rows.push(fields); + fields = []; + fieldBuffer.length = 0; + } + else if (inField) { + fieldBuffer.push(current); } else { - if (rows) { - fields.push(fieldBuffer.join('')) - rows.push(fields); - fields = []; - fieldBuffer.length = 0; - } + if (rows) { + fields.push(fieldBuffer.join('')) + rows.push(fields); + fields = []; + fieldBuffer.length = 0; + } } break; + case ' ': + if (inField) + fieldBuffer.push(current); + break; default: if (inField) fieldBuffer.push(current); + else if(current!==qualifier) { + fieldBuffer.push(current); + inField=true; + inUnqualifiedString=true; + } break; } i += 1; diff --git a/test/string.test.js b/test/string.test.js index 41b5517..600255f 100644 --- a/test/string.test.js +++ b/test/string.test.js @@ -382,6 +382,7 @@ ARY_EQ (S('"a","b""","d","c"').parseCSV(",", "\"", "\""), ['a', 'b"', 'd', 'c']) ARY_EQ (S('"a","","c"').parseCSV(), ['a', '', 'c']) ARY_EQ (S('"","b","c"').parseCSV(), ['', 'b', 'c']) + ARY_EQ (S("'a,',b,'c'").parseCSV(',', "'"), ['a,', 'b', 'c']) var lines = (S('"a\na","b","c"\n"a", """b\nb", "a"').parseCSV(',', '"', '"', '\n')); ARY_EQ(lines[0], [ 'a\na', 'b', 'c' ]);