var Promise = require('bluebird'), csvParser = require('csv-parser'), _ = require('lodash'), fs = require('fs'); function readCSV(options) { var columnsToExtract = options.columnsToExtract || [], results = [], rows = []; return new Promise(function (resolve, reject) { var readFile = fs.createReadStream(options.path); readFile.on('err', function (err) { reject(err); }) .pipe(csvParser()) .on('data', function (row) { rows.push(row); }) .on('end', function () { // If CSV is single column - return all values including header var headers = _.keys(rows[0]), result = {}, columnMap = {}; if (columnsToExtract.length === 1 && headers.length === 1) { results = _.map(rows, function (value) { result = {}; result[columnsToExtract[0].name] = value[headers[0]]; return result; }); // Add first row result = {}; result[columnsToExtract[0].name] = headers[0]; results = [result].concat(results); } else { // If there are multiple columns in csv file // try to match headers using lookup value _.map(columnsToExtract, function findMatches(column) { _.each(headers, function checkheader(header) { if (column.lookup.test(header)) { columnMap[column.name] = header; } }); }); results = _.map(rows, function evaluateRow(row) { var result = {}; _.each(columnMap, function returnMatches(value, key) { result[key] = row[value]; }); return result; }); } resolve(results); }); }); } module.exports = readCSV;