From 225a2020796f420f0cda493b50e848340a631a86 Mon Sep 17 00:00:00 2001 From: dmytroPust Date: Mon, 22 Jun 2020 15:58:12 +0300 Subject: [PATCH] Handle wrap in first column for multiline eol (#153) --- src/csv2json.js | 2 +- test/config/testCsvFilesList.js | 3 ++- test/config/testJsonFilesList.js | 3 ++- test/csv2json.js | 11 +++++++++++ test/data/csv/firstColumnWrapCRLF.csv | 2 ++ test/data/json/firstColumnWrapCRLF.json | 1 + 6 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 test/data/csv/firstColumnWrapCRLF.csv create mode 100644 test/data/json/firstColumnWrapCRLF.json diff --git a/src/csv2json.js b/src/csv2json.js index 0b8bbf8..be91db0 100644 --- a/src/csv2json.js +++ b/src/csv2json.js @@ -148,7 +148,7 @@ const Csv2Json = function(options) { stateVariables.insideWrapDelimiter = false; stateVariables.parsingValue = false; // Next iteration will substring, add the value to the line, and push the line onto the array of lines - } else if (character === options.delimiter.wrap && (index === 0 || utils.getNCharacters(csv, index - 1, eolDelimiterLength) === options.delimiter.eol)) { + } else if (character === options.delimiter.wrap && (index === 0 || utils.getNCharacters(csv, index - eolDelimiterLength, eolDelimiterLength) === options.delimiter.eol)) { // If the line starts with a wrap delimiter (ie. "*) stateVariables.insideWrapDelimiter = true; diff --git a/test/config/testCsvFilesList.js b/test/config/testCsvFilesList.js index 381814e..d706596 100644 --- a/test/config/testCsvFilesList.js +++ b/test/config/testCsvFilesList.js @@ -33,7 +33,8 @@ const fs = require('fs'), {key: 'unwindEmptyArray', file: '../data/csv/unwindEmptyArray.csv'}, {key: 'unwindWithSpecifiedKeys', file: '../data/csv/unwindWithSpecifiedKeys.csv'}, {key: 'localeFormat', file: '../data/csv/localeFormat.csv'}, - {key: 'invalidParsedValues', file: '../data/csv/invalidParsedValues.csv'} + {key: 'invalidParsedValues', file: '../data/csv/invalidParsedValues.csv'}, + {key: 'firstColumnWrapCRLF', file: '../data/csv/firstColumnWrapCRLF.csv'} ]; function readCsvFile(filePath) { diff --git a/test/config/testJsonFilesList.js b/test/config/testJsonFilesList.js index 4b2f427..6c91d86 100644 --- a/test/config/testJsonFilesList.js +++ b/test/config/testJsonFilesList.js @@ -25,5 +25,6 @@ module.exports = { unwind: require('../data/json/unwind'), unwindEmptyArray: require('../data/json/unwindEmptyArray'), localeFormat: require('../data/json/localeFormat'), - invalidParsedValues: require('../data/json/invalidParsedValues') + invalidParsedValues: require('../data/json/invalidParsedValues'), + firstColumnWrapCRLF: require('../data/json/firstColumnWrapCRLF.json') }; diff --git a/test/csv2json.js b/test/csv2json.js index 0834279..78f1237 100644 --- a/test/csv2json.js +++ b/test/csv2json.js @@ -308,6 +308,17 @@ function runTests(jsonTestData, csvTestData) { }); }); + // Test case for #153 + it('should wrap first column with crlf line break', (done) => { + converter.csv2json(csvTestData.firstColumnWrapCRLF, (err, json) => { + if (err) done(err); + json.should.deepEqual(jsonTestData.firstColumnWrapCRLF); + done(); + }, { + delimiter: { eol: '\r\n' } + }); + }); + it('should strip the excel byte order mark character, if specified, and convert to json', (done) => { converter.csv2json(csvTestData.excelBOM, (err, json) => { if (err) done(err); diff --git a/test/data/csv/firstColumnWrapCRLF.csv b/test/data/csv/firstColumnWrapCRLF.csv new file mode 100644 index 0000000..f80a8b3 --- /dev/null +++ b/test/data/csv/firstColumnWrapCRLF.csv @@ -0,0 +1,2 @@ +column 1,column 2,column 3 +"A,B","C,D","E,F" \ No newline at end of file diff --git a/test/data/json/firstColumnWrapCRLF.json b/test/data/json/firstColumnWrapCRLF.json new file mode 100644 index 0000000..a6776db --- /dev/null +++ b/test/data/json/firstColumnWrapCRLF.json @@ -0,0 +1 @@ +[ { "column 1": "A,B", "column 2": "C,D", "column 3": "E,F" } ] \ No newline at end of file