@rr0/cms
Version:
RR0 Content Management System (CMS)
47 lines (46 loc) • 1.64 kB
JavaScript
import csv from "csv-parser";
export class CSVFileReader {
constructor(stream, logger, columnNames, separator = ";", create = (data) => {
const obj = {};
for (const column of columnNames) {
obj[column] = data[column];
}
return obj;
}) {
this.stream = stream;
this.logger = logger;
this.columnNames = columnNames;
this.separator = separator;
this.create = create;
this.values = [];
}
async read() {
if (this.values.length > 0) {
this.logger.warn("Overwriting previously read values", this.values);
}
this.values = [];
const columnNames = this.columnNames;
// eslint-disable-next-line @typescript-eslint/no-this-alias
const self = this;
return new Promise((resolve, reject) => {
const readValues = this.values;
self.stream
.pipe(csv({ separator: this.separator }))
.on("headers", (headers) => {
if (!columnNames.every((column) => headers.includes(column))) {
reject(`Could not find column "${columnNames}" in header`);
return;
}
})
.on("data", (data) => {
const columnValue = this.create(data);
readValues.push(columnValue);
})
.on("end", () => {
this.logger.debug("Read", readValues);
this.logger.debug("Read", readValues.length, "values");
resolve(readValues);
});
});
}
}