Парсинг и транформация данных в формате 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 шт):

Автор решения: nörbörnën

В документации есть достаточный пример транформации данных средствами самой используемой вами библиотеки.

Пример как это можно сделать, обратите внимание на 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

→ Ссылка