Skip to content

Commit

Permalink
Merge pull request #97 from Sergio-Muriel/master
Browse files Browse the repository at this point in the history
parseCsv with unqualified fields
  • Loading branch information
jprichardson committed Aug 6, 2014
2 parents c9affb3 + 53245b6 commit 7b03990
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 13 deletions.
47 changes: 34 additions & 13 deletions lib/string.js
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ string.js - Copyright (C) 2012-2014, JP Richardson <jprichardson@gmail.com>
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 = [];

Expand All @@ -270,17 +270,21 @@ string.js - Copyright (C) 2012-2014, JP Richardson <jprichardson@gmail.com>
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 {
Expand All @@ -289,20 +293,37 @@ string.js - Copyright (C) 2012-2014, JP Richardson <jprichardson@gmail.com>
}
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;
Expand Down
1 change: 1 addition & 0 deletions test/string.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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' ]);
Expand Down

0 comments on commit 7b03990

Please sign in to comment.