Стригировать данные с карты? - PullRequest
0 голосов
/ 27 февраля 2019

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

1 Ответ

0 голосов
/ 27 февраля 2019

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

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 в память и создать карту или массивof замен
  2. Создание читаемого потока из файла TXT
  3. Создание потока преобразования и передача в него доступного для чтения
  4. Создание потока с возможностью записи и передача преобразования вit

Я также могу предложить использовать созданный мной фреймворк scramjet , который может сделать код более простым и понятным:

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 - вот цель этой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...