RosettaCodeData/Task/CSV-data-manipulation/JavaScript/csv-data-manipulation-2.js

42 lines
1.1 KiB
JavaScript

const fs = require('fs');
// formats for the data parameter in the function below: {col1: array | function, col2: array | function}
function addCols(path, data) {
let csv = fs.readFileSync(path, 'utf8');
csv = csv.split('\n').map(line => line.trim());
let colNames = Object.keys(data);
for (let i = 0; i < colNames.length; i++) {
let c = colNames[i];
if (typeof data[c] === 'function') {
csv = csv.map((line, idx) => idx === 0
? line + ',' + c
: line + ',' + data[c](line, idx)
);
} else if (Array.isArray(data[c])) {
csv = csv.map((line, idx) => idx === 0
? line + ',' + c
: line + ',' + data[c][idx - 1]
);
}
}
fs.createWriteStream(path, {
flag: 'w',
defaultEncoding: 'utf8'
}).end(csv.join('\n'));
}
addCols('test.csv', {
sum: function (line, idx) {
let s = 0;
line = line.split(',').map(d => +(d.trim()));
for (let i = 0; i < line.length; i++) {
s += line[i];
}
return s;
},
id: function(line, idx) {
return idx;
}
});