@@ -9,6 +9,8 @@ var fileLineToCSVLine = require("./fileLineToCSVLine");
99var linesToJson = require ( "./linesToJson" ) ;
1010var CSVError = require ( "./CSVError" ) ;
1111var workerMgr = null ;
12+ var _ = require ( 'lodash' ) ;
13+ var rowSplit = require ( "./rowSplit" ) ;
1214function Converter ( params , options ) {
1315 Transform . call ( this , options ) ;
1416 this . _options = options || { } ;
@@ -212,33 +214,88 @@ Converter.prototype.processHead = function (fileLine, cb) {
212214 if ( params . _headers ) {
213215 return cb ( ) ;
214216 }
215-
217+ //dirty hack
218+ params . _needFilterRow = false ;
216219 // if header is not inited. init header
217- var lines = fileLineToCSVLine ( fileLine , params ) ;
218- this . setPartialData ( lines . partial ) ;
220+ var lines = fileLine . lines ;
221+ var left = "" ;
222+ var headerRow = [ ] ;
223+ if ( ! params . noheader ) {
224+ while ( lines . length ) {
225+ var line = left + lines . shift ( ) ;
226+ var row = rowSplit ( line , params ) ;
227+ if ( row . closed ) {
228+ headerRow = row . cols ;
229+ left = "" ;
230+ break ;
231+ } else {
232+ left = line + this . getEol ( ) ;
233+ }
234+ }
235+ }
236+ params . _needFilterRow = true ;
237+ if ( ! params . noheader && headerRow . length === 0 ) { //if one chunk of data does not complete header row.
238+ this . setPartialData ( left ) ;
239+ return cb ( ) ;
240+ }
219241 if ( params . noheader ) {
220242 if ( params . headers ) {
221243 params . _headers = params . headers ;
222244 } else {
223245 params . _headers = [ ] ;
224246 }
225247 } else {
226- var headerRow = lines . lines . shift ( ) ;
227248 if ( params . headers ) {
228249 params . _headers = params . headers ;
229250 } else {
230251 params . _headers = headerRow ;
231252 }
232253 }
254+ configIgnoreIncludeColumns ( params ) ;
255+ params . _headers = require ( "./filterRow" ) ( params . _headers , params ) ;
256+ var lines = fileLineToCSVLine ( fileLine , params ) ;
257+ this . setPartialData ( lines . partial ) ;
233258 if ( this . param . workerNum > 1 ) {
234259 this . workerMgr . setParams ( params ) ;
235260 }
236261 var res = linesToJson ( lines . lines , params , 0 ) ;
237262 this . processResult ( res ) ;
238263 this . lastIndex += res . length ;
239264 this . recordNum += res . length ;
265+
240266 cb ( ) ;
241267} ;
268+ function configIgnoreIncludeColumns ( params ) {
269+ if ( params . _postIgnoreColumns ) {
270+ for ( var i = 0 ; i < params . ignoreColumns . length ; i ++ ) {
271+ var ignoreCol = params . ignoreColumns [ i ] ;
272+ if ( typeof ignoreCol === "string" ) {
273+ var idx = params . _headers . indexOf ( ignoreCol ) ;
274+ if ( idx > - 1 ) {
275+ params . ignoreColumns [ i ] = idx ;
276+ } else {
277+ params . ignoreColumns [ i ] = - 1 ;
278+ }
279+ }
280+ }
281+ params . ignoreColumns . sort ( function ( a , b ) { return b - a ; } ) ;
282+ }
283+ if ( params . _postIncludeColumns ) {
284+ for ( var i = 0 ; i < params . includeColumns . length ; i ++ ) {
285+ var includeCol = params . includeColumns [ i ] ;
286+ if ( typeof includeCol === "string" ) {
287+ var idx = params . _headers . indexOf ( includeCol ) ;
288+ if ( idx > - 1 ) {
289+ params . includeColumns [ i ] = idx ;
290+ } else {
291+ params . includeColumns [ i ] = - 1 ;
292+ }
293+ }
294+ }
295+ }
296+ params . ignoreColumns = _ . uniq ( params . ignoreColumns ) ;
297+ params . includeColumns = _ . uniq ( params . includeColumns ) ;
298+ }
242299
243300Converter . prototype . processResult = function ( result ) {
244301 for ( var i = 0 , len = result . length ; i < len ; i ++ ) {
0 commit comments