Парсинг и транформация данных в формате csv потоками (streams)
Собственно ниже предоставлю мой рабочий код. У меня есть претензии к его оптимизации. Как мне распарсить данные .csv и передать его в поток записи без дополнительных перемены? Размер данных превышает 3000 строк.я не могу позволить храниться столько данных в одной переменной. Я пробовал через Transform , а именно :
const fs = require("fs");
const { parse } = require("csv-parse");
const path = require("path");
const writeNewCsvFile = require("./moduleForRead/writeNewCsvFile");
const createNewFileOfCsv = require("./moduleForRead/createNewFileOfCsv");
const filterCsvFile = require("./moduleForRead/filterCsvFile");
const transformStream = require("./moduleForRead/moduleForTransform")
const OLD_DATA_FILE = path.resolve(__dirname, "dataOfCsv.csv");
const NEW_DATA_FILE = path.resolve(__dirname, "newDataOfCsv.csv");
const readAnFilterCsvFile = () => {
const writeStream = fs.createWriteStream(NEW_DATA_FILE);
fs.createReadStream(OLD_DATA_FILE)
.on("error", (error) => {
console.error(`Ошибка при чтении файла ${OLD_DATA_FILE} : `, error);
})
.pipe(parse({ columns: true }))
.pipe(transformStream)
.pipe(writeStream)
};
readAnFilterCsvFile();
Transform
const transformStream = new Transform({
transform(chunk, encoding, callback) {
this.push(chunk);
callback();
}
});
transformStream.on("error", (error) => {
console.log("Ошибка при создании потока трансформации: ", error);
});
module.exports = transformStream;
TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or an instance of Buffer or Uint8Array. Received an instance of Object
Chunk я приводил к типу строка.Результата нет. ниже мой рабочий код:
const readAnFilterCsvFile = () => {
let result = [];
fs.createReadStream(OLD_DATA_FILE)
.on("error", (error) => {
console.error(`Ошибка при чтении файла ${OLD_DATA_FILE} : `, error);
})
.pipe(parse({ columns: true }))
.on("data", (item) => {
result.push(item);
})
.on("end", () => {
const filter = filterCsvFile(result);
const newData = createNewFileOfCsv(filter);
writeNewCsvFile(NEW_DATA_FILE, newData);
});
};
readAnFilterCsvFile();
Ответы (1 шт):
В документации есть достаточный пример транформации данных средствами самой используемой вами библиотеки.
Пример как это можно сделать, обратите внимание на csv.transform
:
const fs = require('node:fs');
const path = require('node:path');
const { pipeline } = require('node:stream/promises');
const csv = require('csv');
(
async () => {
const inputFilepath = path.resolve(__dirname, 'input.csv');
const outputFilepath = path.resolve(__dirname, 'output.csv');
await readAnFilterCsvFile(inputFilepath, outputFilepath);
console.log('INPUT FILE DATA:\n----');
console.log(fs.readFileSync(inputFilepath, { encoding: 'utf-8' }));
console.log('OUTPUT FILE DATA:\n----');
console.log(fs.readFileSync(outputFilepath, { encoding: 'utf-8' }));
}
)().catch(console.error);
/**
* @param {string} inputFilepath
* @param {string} outputFilepath
* @returns {Promise<void>}
*/
async function readAnFilterCsvFile(inputFilepath, outputFilepath) {
await pipeline(
fs.createReadStream(inputFilepath),
// Transform CSV data into records
csv.parse({ delimiter: ';', columns: true }),
// Transform each value into uppercase
csv.transform((/** @type {Record<string, string>} */ record) => {
Object.entries(record).forEach(([k, v]) => {
record[k] = v.toLocaleUpperCase();
});
return record;
}),
// Convert objects into a stream
csv.stringify({ header: true, quoted: true }),
fs.createWriteStream(outputFilepath),
);
}
Вывод в консоль:
INPUT FILE DATA:
----
Название;Дата проведения;Время начала;Время окончания;Максимальное число посетителей;Статус события с антрактом
Игра как судьба;2024-04-29;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-28;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-27;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-26;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-24;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-22;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-21;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-20;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-19;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-17;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-15;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-14;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-13;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-12;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-10;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-08;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-07;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-06;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-05;19:00;20:50;217;С антрактом
Игра как судьба;2024-04-03;19:00;20:50;217;С антрактом
OUTPUT FILE DATA:
----
"Название","Дата проведения","Время начала","Время окончания","Максимальное число посетителей","Статус события с антрактом"
"ИГРА КАК СУДЬБА","2024-04-29","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-28","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-27","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-26","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-24","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-22","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-21","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-20","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-19","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-17","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-15","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-14","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-13","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-12","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-10","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-08","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-07","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-06","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-05","19:00","20:50","217","С АНТРАКТОМ"
"ИГРА КАК СУДЬБА","2024-04-03","19:00","20:50","217","С АНТРАКТОМ"
nodejs v21.7.1, npm:csv v6.3.8