csv-for-you
Version:
CSV parser. Supports all nodeJS versions.
47 lines (37 loc) • 1.66 kB
JavaScript
const fs = require('fs');
const InvalidLineNumberError = require('../../errors/InvalidLineNumber');
const InvalidRequestError = require('../../errors/InvalidDataError');
const NoFileError = require('../../errors/NoFileError');
// ! data must be an object with the same properties as the original line
module.exports.editRow = (filePath, { data, lineNumber }) => {
if (!fs.existsSync(filePath)) {
throw new NoFileError(`File does not exist: ${filePath}`);
}
fs.readFile(filePath, 'utf8', (err, fileData) => {
if (err) {
return new Error(`Error reading file: ${err.message}`);
}
let lines;
if (fileData.indexOf('\r\n') !== -1) {
lines = fileData.split('\r\n');
} else lines = fileData.split('\n');
if (lineNumber < 1 || lineNumber >= lines.length) {
return new InvalidLineNumberError(`Invalid line number: ${lineNumber}`);
}
const headers = lines[0].split(',');
const dataKeys = Object.keys(data);
for (const header of headers) {
if (!dataKeys.includes(header)) {
return new InvalidRequestError(`Missing property "${header}" in data`);
}
}
const updatedLine = headers.map((header) => data[header]).join(',');
lines[lineNumber] = updatedLine;
fs.writeFile(filePath, lines.join('\n'), (err) => {
if (err) {
throw new Error(`Error writing to file: ${err.message}`);
}
console.log(`Line ${lineNumber} updated successfully.`);
});
});
}