diff --git a/libs/core/Converter.js b/libs/core/Converter.js index 7cdbe19..ef653f2 100644 --- a/libs/core/Converter.js +++ b/libs/core/Converter.js @@ -36,6 +36,7 @@ function Converter(params, options) { this._needJson = null; this._needEmitResult = null; this._needEmitFinalResult = null; + this._needEmitHeader = null; this._needEmitJson = null; this._needPush = null; this._needEmitCsv = null; @@ -55,6 +56,9 @@ function Converter(params, options) { if (this._needEmitJson === null) { this._needEmitJson = this.listeners("json").length > 0; } + if (this._needEmitHeader === null) { + this._needEmitHeader = this.listeners("header").length > 0; + } if (this._needEmitCsv === null) { this._needEmitCsv = this.listeners("csv").length > 0; } @@ -297,6 +301,8 @@ Converter.prototype.processHead = function (fileLine, cb) { this.workerMgr.setParams(params); } var res = linesToJson(lines.lines, params, 0); + // Put the header with the first row + if(res.length > 0) res[0].header = params._headers; this.processResult(res); this.lastIndex += res.length; this.recordNum += res.length; @@ -348,6 +354,7 @@ Converter.prototype.processResult = function (result) { Converter.prototype.emitResult = function (r) { var index = r.index; + var header = r.header; var row = r.row; var result = r.json; var resultJson = null; @@ -367,6 +374,9 @@ Converter.prototype.emitResult = function (r) { this.transform(resultJson, row, index); resultStr = null; } + if (this._needEmitHeader && header) { + this.emit("header", header); + } if (this._needEmitJson) { this.emit("json", resultJson, index); } diff --git a/package.json b/package.json index 26b00dd..65315df 100644 --- a/package.json +++ b/package.json @@ -190,7 +190,7 @@ "hireable": true } ], - "version": "1.1.7", + "version": "1.1.8", "keywords": [ "csv", "csv parser", diff --git a/readme.md b/readme.md index 4f80a34..90b25bb 100644 --- a/readme.md +++ b/readme.md @@ -272,6 +272,22 @@ All parameters can be used in Command Line tool. `Converter` class defined a series of events. +### header + +`header` event is emitted for each CSV file. It passes an array object which contains the names of the header row. + +```js +const csv=require('csvtojson') +csv() +.on('header',(header)=>{ + //header=> [header1, header2, header3] +}) +``` + +`header` is always an array of strings without types. + +`header` event will be emitted regardless of the `noHeaders` parameter setting. + ### json `json` event is emitted for each parsed CSV line. It passes JSON object and the row number of the CSV line in its callback function. diff --git a/test/testCSVConverter2.js b/test/testCSVConverter2.js index 090e46c..c4ec513 100644 --- a/test/testCSVConverter2.js +++ b/test/testCSVConverter2.js @@ -434,6 +434,10 @@ describe("CSV Converter", function () { ignoreColumns:[0] }) .fromStream(rs) + .on("header", function(header) { + assert.equal(header.indexOf("TIMESTAMP"), -1); + assert.equal(header.indexOf("UPDATE"), 0); + }) .on("csv", function(row, idx) { assert(idx >= 0); if (idx ===1){ @@ -455,6 +459,11 @@ describe("CSV Converter", function () { includeColumns:[0] }) .fromStream(rs) + .on("header", function(header) { + assert.equal(header.indexOf("TIMESTAMP"), 0); + assert.equal(header.indexOf("UPDATE"), -1); + assert.equal(header.length, 1); + }) .on("csv", function(row, idx) { assert(idx >= 0); assert.equal(row.length, 1);