Упорядочить данные с карты?

Конечная цель состоит в том, чтобы ввести массивный текстовый файл и заменить все слова, указанные в файле csv. Новый файл txt будет создан вместе с новым файлом csv, в котором будет подсчитано количество вхождений каждого слова.

У меня проблемы с записью данных карты в новый файл csv. Я понимаю, что данные не определены, но как мне изменить их, чтобы они были читаемы?

Какую бы map.thingie я не вставлял в поле data.push, я получаю ошибку.

var fs = require('fs');
var inputFile='OneLetter.csv';
var parse = require('csv-parse');
var map1 = new Map();
var iterator = map1[Symbol.iterator]();


//This part creates a stream, essentially reads it and creates a list

var parser = parse({delimiter: ';'}, function (err, data) {
    data.forEach(function(line) {
      // create line object out of parsed fields
      var list = map1.set(line) 
     });
        for (let item of iterator) {
    console.info(item)
    };    
});

fs.createReadStream(inputFile).pipe(parser);


//This program writes a CSV file containing data in the data1, data2... fields

let data = [];
let columns = {
        Column1: '# times',
        Column2: 'Original',
        Column3: 'Short'
};

  data.push(['data1',
             'data2',
             'data3'
]); 

var stringify = require('csv-stringify');

stringify(data ,{ delimiter: ';', header: true, columns: columns }, (err, output) => {
  if (err) throw err;
  fs.writeFile('TEST.csv', output, (err) => {
    if (err) throw err;
    console.info('TEST.csv saved.');
  });
});

Working Result:

[ [ 'A', 'A' ], undefined ]
[ [ 'B', 'BE' ], undefined ]
[ [ 'C', 'SEE' ], undefined ]
[ [ 'D', 'IN THE' ], undefined ]
[ [ 'E', 'HE' ], undefined ]
[ [ 'F', 'OF THE' ], undefined ]
[ [ 'G', 'FROM THE' ], undefined ]
[ [ 'H', 'HAS' ], undefined ]
[ [ 'I', 'I' ], undefined ]
[ [ 'J', 'BY WHICH' ], undefined ]
[ [ 'K', 'OUT OF THE' ], undefined ]
[ [ 'L', 'ALL' ], undefined ]
[ [ 'M', 'MORE' ], undefined ]
[ [ 'N', 'NOT' ], undefined ]
[ [ 'O', 'OF' ], undefined ]
[ [ 'P', 'PER' ], undefined ]
[ [ 'Q', 'ON THE' ], undefined ]
[ [ 'R', 'ARE' ], undefined ]
[ [ 'S', 'SEPERATOR' ], undefined ]
[ [ 'T', 'THE' ], undefined ]
[ [ 'U', 'YOU' ], undefined ]
[ [ 'V', 'OF WHICH' ], undefined ]
[ [ 'W', 'WITH' ], undefined ]
[ [ 'X', 'IN WHICH' ], undefined ]
[ [ 'Y', 'YES' ], undefined ]
[ [ 'Z', 'FROM WHICH' ], undefined ]
TEST.csv saved.

Нерабочий результат:

Error: Invalid Record: expect an array or an object, got undefined
    at Stringifier._transform (C:\Program Files\nodejs\node_modules\csv-stringify\lib\index.
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
214
1

Ответы 1

Кажется, я не вижу возможности преобразовать метод parse в соответствии с документацией — вам нужно попытаться использовать трансформировать, чтобы он работал так, как вы хотите, — поэтому создайте его и передайте следующим образом:

const transformer = transform(function(data){
    return replaceEntries(data); // here you call the replacement
});
fs.createReadStream(textFile).pipe(parser).pipe(transformer).pipe(stringify);

Трансформатор необходимо подготовить перед

Судя по вашему случаю, кажется, что передача функции преобразования не документирована, и из-за этого может возникнуть ошибка... Кроме того, ваш код, похоже, не делает то, чего вы пытаетесь достичь, больше похоже на то, что вы пытаетесь создать новый CSV.

Я думаю, что вы, возможно, начали задачу со странного угла, поэтому я бы посоветовал вам повторить с самого начала - вам нужно написать программу, которая делает следующее в следующем порядке:

  1. Считайте файл CSV в память и создайте карту или массив замен
  2. Создайте читаемый поток из файла TXT
  3. Создайте поток преобразования и передайте ему читаемое
  4. Создайте доступный для записи поток и передайте в него преобразование.

Также могу предложить использовать созданный мной фреймворк ГПВРД, который может сделать код проще и понятнее:

const {StringStream} = require("scramjet");

StringStream
    // here we read the file
    .from(fs.createReadStream('massive.txt'))
    .use(async stream => {
        // here we create replacements
        const replacements = await (
            StringStream.from(fs.createReadStream('massive.txt'))
                .csvParse({header: false})
                // the line below will make sure we're replacing whole words
                .map(([_from, _to]) => ([new RegExp(`\b${_from}\b`, "g"), _to])
                .toArray()
        );

        // here we map all the items in the stream and iterate over all the replacements
        return stream.map(
            chunk => replacements.reduce((s, [_from, _to]) => s.replace(_from, _to), chunk)
        );
    })
    // and here we push the replaced stream to the output file
    .pipe(fs.createWriteStream('massive-file-out.txt');

Пожалуйста, проверьте строку, начинающуюся с .map(([_from, _to]) =>. Я предполагаю, что вы хотите заменить текст, только если это целое слово, поэтому больше R U ready -> Are you ready, а не Robert -> Areobert - это цель этой строки.

Извините, но я не знаю, как правильно использовать этот код. Вероятно, было бы полезно узнать, что делает ([new RegExp(\b${_from}\b, "g"), _to]). Кроме того, раньше данные карты не загружались как отдельные ключи/значения, но сейчас я это исправил. Я нигде не читаю в приведенном выше коде, где он берет ключи/значения из ранее созданной карты, а создает новую карту. Также вы пропустили несколько ) здесь и там, которые я исправил.

Seabottom 01.03.2019 21:16

Я создам репо на github и опубликую рабочий пример. Что касается RegExp - это регулярное выражение, которое соответствует целым словам.

Michał Karpacki 07.03.2019 09:36

Другие вопросы по теме