Конечная цель состоит в том, чтобы ввести массивный текстовый файл и заменить все слова, указанные в файле 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.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Кажется, я не вижу возможности преобразовать метод parse в соответствии с документацией — вам нужно попытаться использовать трансформировать, чтобы он работал так, как вы хотите, — поэтому создайте его и передайте следующим образом:
const transformer = transform(function(data){
return replaceEntries(data); // here you call the replacement
});
fs.createReadStream(textFile).pipe(parser).pipe(transformer).pipe(stringify);
Трансформатор необходимо подготовить перед
Судя по вашему случаю, кажется, что передача функции преобразования не документирована, и из-за этого может возникнуть ошибка... Кроме того, ваш код, похоже, не делает то, чего вы пытаетесь достичь, больше похоже на то, что вы пытаетесь создать новый CSV.
Я думаю, что вы, возможно, начали задачу со странного угла, поэтому я бы посоветовал вам повторить с самого начала - вам нужно написать программу, которая делает следующее в следующем порядке:
Также могу предложить использовать созданный мной фреймворк ГПВРД, который может сделать код проще и понятнее:
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 - это цель этой строки.
Я создам репо на github и опубликую рабочий пример. Что касается RegExp - это регулярное выражение, которое соответствует целым словам.
Извините, но я не знаю, как правильно использовать этот код. Вероятно, было бы полезно узнать, что делает ([new RegExp(
\b${_from}\b, "g"), _to]). Кроме того, раньше данные карты не загружались как отдельные ключи/значения, но сейчас я это исправил. Я нигде не читаю в приведенном выше коде, где он берет ключи/значения из ранее созданной карты, а создает новую карту. Также вы пропустили несколько ) здесь и там, которые я исправил.