diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js index 894968935..8ab296159 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-CSV.js @@ -38,18 +38,18 @@ module.exports = function(RED) { if (this.hdrout === true) { this.hdrout = "all"; } var tmpwarn = true; var node = this; - var re = new RegExp(node.sep+'(?=(?:(?:[^"]*"){2})*[^"]*$)','g'); + var re = new RegExp(node.sep.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g,'\\$&') + '(?=(?:(?:[^"]*"){2})*[^"]*$)','g'); // pass in an array of column names to be trimmed, de-quoted and retrimmed var clean = function(col,sep) { - if (sep) { re = new RegExp(sep+'(?=(?:(?:[^"]*"){2})*[^"]*$)','g'); } + if (sep) { re = new RegExp(sep.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g,'\\$&') +'(?=(?:(?:[^"]*"){2})*[^"]*$)','g'); } col = col.trim().split(re) || [""]; col = col.map(x => x.replace(/"/g,'').trim()); if ((col.length === 1) && (col[0] === "")) { node.goodtmpl = false; } else { node.goodtmpl = true; } return col; } - var template = clean(node.template); + var template = clean(node.template,','); var notemplate = template.length === 1 && template[0] === ''; node.hdrSent = false; @@ -185,7 +185,7 @@ module.exports = function(RED) { if ((node.hdrin === true) && first) { // if the template is in the first line if ((line[i] === "\n")||(line[i] === "\r")||(line.length - i === 1)) { // look for first line break if (line.length - i === 1) { tmp += line[i]; } - template = clean(tmp); + template = clean(tmp,node.sep); first = false; } else { tmp += line[i]; } diff --git a/test/nodes/core/parsers/70-CSV_spec.js b/test/nodes/core/parsers/70-CSV_spec.js index cccf7bf1c..b2004eb75 100644 --- a/test/nodes/core/parsers/70-CSV_spec.js +++ b/test/nodes/core/parsers/70-CSV_spec.js @@ -87,6 +87,40 @@ describe('CSV node', function() { }); }); + it('should convert a simple string to a javascript object with | separator (no template)', function(done) { + var flow = [ { id:"n1", type:"csv", sep:"|", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(csvNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + msg.should.have.property('payload', { col1: 1, col2: 2, col3: 3, col4: 4 }); + msg.should.have.property('columns', "col1,col2,col3,col4"); + check_parts(msg, 0, 1); + done(); + }); + var testString = "1|2|3|4"+String.fromCharCode(10); + n1.emit("input", {payload:testString}); + }); + }); + + it('should convert a simple string to a javascript object with tab separator (with template)', function(done) { + var flow = [ { id:"n1", type:"csv", sep:"\t", temp:"A,B,,D", wires:[["n2"]] }, + {id:"n2", type:"helper"} ]; + helper.load(csvNode, flow, function() { + var n1 = helper.getNode("n1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + msg.should.have.property('payload', { A: 1, B: 2, D: 4 }); + msg.should.have.property('columns', "A,B,D"); + check_parts(msg, 0, 1); + done(); + }); + var testString = "1\t2\t3\t4"+String.fromCharCode(10); + n1.emit("input", {payload:testString}); + }); + }); + it('should remove quotes and whitespace from template', function(done) { var flow = [ { id:"n1", type:"csv", temp:'"a", "b" , " c "," d " ', wires:[["n2"]] }, {id:"n2", type:"helper"} ];