Skip to content

Commit c837dd7

Browse files
committed
fix: add case for quoted empty field value in csv record
* Handles quoted empty field values which appear in a CSV record row. Fixes #115
1 parent 6897465 commit c837dd7

File tree

4 files changed

+23
-2
lines changed

4 files changed

+23
-2
lines changed

src/csv2json.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ const Csv2Json = function(options) {
158158
stateVariables.startIndex = index + 2; // next value starts after the field delimiter
159159
stateVariables.insideWrapDelimiter = false;
160160
stateVariables.parsingValue = false;
161+
} else if (character === options.delimiter.wrap && charBefore === options.delimiter.field &&
162+
!stateVariables.insideWrapDelimiter && !stateVariables.parsingValue) {
163+
164+
stateVariables.startIndex = index;
165+
stateVariables.insideWrapDelimiter = true;
166+
stateVariables.parsingValue = true;
161167
} else if (character === options.delimiter.wrap && charBefore === options.delimiter.field &&
162168
!stateVariables.insideWrapDelimiter && stateVariables.parsingValue) {
163169
// If we reached a wrap delimiter with a field delimiter after it (ie. ,"*)

test/data/csv/emptyFieldValues.csv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
arrayOfStrings,object.subField,isBoolean,optionalField,number
22
"[""test1"",""test2""]",,true,this one has it,
3-
"[""test3"",""test4""]",subValue,false,,7
3+
"[""test3"",""test4""]",subValue,false,,7
4+
"",test123,false,"",13

test/data/json/emptyFieldValues.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,12 @@ module.exports = [
1212
number: 7,
1313
isBoolean: false,
1414
optionalField: null
15+
},
16+
{
17+
arrayOfStrings: '',
18+
object: { subField: 'test123' },
19+
number: 13,
20+
isBoolean: false,
21+
optionalField: ''
1522
}
1623
];

test/json2csv.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,14 @@ function runTests(jsonTestData, csvTestData) {
356356
jsonTestData.emptyFieldValues[0].number = undefined;
357357
converter.json2csv(jsonTestData.emptyFieldValues, (err, csv) => {
358358
if (err) done(err);
359-
csv.should.equal(csvTestData.emptyFieldValues);
359+
360+
// Replace double quotation marks around the empty field which are used
361+
// to verify that csv2json properly handles that case
362+
let expectedCsv = csvTestData.emptyFieldValues
363+
.replace(',"",', ',,')
364+
.replace(/\n"",/g, '\n,');
365+
366+
csv.should.equal(expectedCsv);
360367
done();
361368
}, {
362369
emptyFieldValue: ''

0 commit comments

Comments
 (0)