From 3009166168f15343c3961e15ea5971421073e2ed Mon Sep 17 00:00:00 2001 From: Sergio Muriel Date: Thu, 31 Jul 2014 17:33:29 +0200 Subject: [PATCH 1/5] parseCsv with unqualified fields --- lib/string.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/string.js b/lib/string.js index fc6fe31..6245b08 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 = []; @@ -281,6 +281,11 @@ string.js - Copyright (C) 2012-2014, JP Richardson inField = !inField; break; case delimiter: + if(inField && inUnqualifiedString) + { + inField=false; + inUnqualifiedString=false; + } if (inField && qualifier) fieldBuffer.push(current); else { @@ -289,7 +294,16 @@ string.js - Copyright (C) 2012-2014, JP Richardson } break; case lineDelimiter: - if (inField) { + if(inField && 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) { @@ -300,9 +314,18 @@ string.js - Copyright (C) 2012-2014, JP Richardson } } 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; From be92f269e9dd8562c4e10bad72810596001e21ae Mon Sep 17 00:00:00 2001 From: Sergio Muriel Date: Thu, 31 Jul 2014 17:59:59 +0200 Subject: [PATCH 2/5] parseCsv: add test for unQualified fields --- test/string.test.js | 1 + 1 file changed, 1 insertion(+) 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' ]); From 39b7ef40aa0603f92b1f05acc0f9d3e63be50890 Mon Sep 17 00:00:00 2001 From: Sergio Muriel Date: Thu, 31 Jul 2014 18:18:11 +0200 Subject: [PATCH 3/5] simplify conditions on unQualifiedString --- lib/string.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/string.js b/lib/string.js index 6245b08..7e4b825 100644 --- a/lib/string.js +++ b/lib/string.js @@ -281,7 +281,7 @@ string.js - Copyright (C) 2012-2014, JP Richardson inField = !inField; break; case delimiter: - if(inField && inUnqualifiedString) + if(inUnqualifiedString) { inField=false; inUnqualifiedString=false; @@ -294,7 +294,7 @@ string.js - Copyright (C) 2012-2014, JP Richardson } break; case lineDelimiter: - if(inField && inUnqualifiedString) + if(inUnqualifiedString) { inField=false; inUnqualifiedString=false; From ea0b56472758dee2bcd9a5d744001fc5c4c186f7 Mon Sep 17 00:00:00 2001 From: Sergio Muriel Date: Tue, 5 Aug 2014 09:31:02 +0200 Subject: [PATCH 4/5] Change indentation to 2 spaces --- lib/string.js | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/string.js b/lib/string.js index 7e4b825..367dc10 100644 --- a/lib/string.js +++ b/lib/string.js @@ -270,21 +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; + inField=false; + inUnqualifiedString=false; } if (inField && qualifier) fieldBuffer.push(current); @@ -296,22 +296,22 @@ string.js - Copyright (C) 2012-2014, JP Richardson case lineDelimiter: if(inUnqualifiedString) { - inField=false; - inUnqualifiedString=false; + 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; - } - else if (inField) { - fieldBuffer.push(current); - } else { - if (rows) { - fields.push(fieldBuffer.join('')) - rows.push(fields); - fields = []; - fieldBuffer.length = 0; - } + } } break; case ' ': @@ -322,9 +322,9 @@ string.js - Copyright (C) 2012-2014, JP Richardson if (inField) fieldBuffer.push(current); else if(current!==qualifier) { - fieldBuffer.push(current); - inField=true; - inUnqualifiedString=true; + fieldBuffer.push(current); + inField=true; + inUnqualifiedString=true; } break; } From 53245b68c81c5fa9abcf23b68ab650b250542fc0 Mon Sep 17 00:00:00 2001 From: Sergio Muriel Date: Tue, 5 Aug 2014 09:32:48 +0200 Subject: [PATCH 5/5] Open brackets with no new line --- lib/string.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/string.js b/lib/string.js index 367dc10..d2a7518 100644 --- a/lib/string.js +++ b/lib/string.js @@ -281,8 +281,7 @@ string.js - Copyright (C) 2012-2014, JP Richardson inField = !inField; break; case delimiter: - if(inUnqualifiedString) - { + if(inUnqualifiedString) { inField=false; inUnqualifiedString=false; } @@ -294,8 +293,7 @@ string.js - Copyright (C) 2012-2014, JP Richardson } break; case lineDelimiter: - if(inUnqualifiedString) - { + if(inUnqualifiedString) { inField=false; inUnqualifiedString=false; fields.push(fieldBuffer.join(''))