Как СИНХРОННО считать файл в массив построчно в NodeJS?
Нужно считать файл построчно, каждую строку запихнуть в массив как очередной элемент. Далее выбирается рандомный элемент из полученного массива и экспортируется для употребления в синхронном коде.
Есть некоторый рабочий код (ниже), но он АСИНХРОННЫЙ, и он тупиковый - ничего не вытащищь наружу и не экспортируешь. А существует ли обычный метод? Или как сделать код ниже синхронным? Заранее спасибо!
function fileToArray(Object_) {
return new Promise((resolve, reject) => {
const rl = readline.createInterface({
input: fs.createReadStream(Object_.file),
crlfDelay: Infinity
});
rl.on('line', line => Object_.array.push(line));
rl.on('close', () => resolve(Object_.array));
rl.on('error', err => reject(err))
});
}
Ответы (2 шт):
Если файл небольшой, можно так:
const lines = fs.readFileSync('./file.txt', 'utf8').split(/\r?\n/);
Есть некоторый рабочий код (ниже), но он АСИНХРОННЫЙ, и он тупиковый - ничего не вытащищь наружу и не экспортируешь.
Суждение о том, что код "тупиковый", - абсолютно неверное суждение, обусловленное незнанием базовых практик.
С вашим асинхронным построчным чтением файла очень легко работать:
const fs = require('fs');
const path = require('path');
const readline = require('readline');
{
// callback version
const filepath = path.join(__dirname, 'data.txt');
fileToArray(filepath).then((arr) => console.log('cb', arr)).catch(console.error);
}
(async () => {
// async version
const filepath = path.join(__dirname, 'data.txt');
const arr = await fileToArray(filepath);
console.log('async', arr);
})();
async function fileToArray(filepath) {
const input = fs.createReadStream(filepath);
const res = await new Promise((resolve, reject) => {
const strings = [];
const rl = readline.createInterface({
input,
crlfDelay: Infinity
});
rl.on('line', (line) => strings.push(line));
rl.once('close', () => resolve(strings));
rl.once('error', (err) => reject(err));
});
return res;
}
Вывод в терминал:
[
'[', '{"a":1},',
'{"b":1},', '{"c":1},',
'{"d":1},', '{"e":1},',
'{"f":1},', '{"j":1},',
'{"h":1},', '{"i":1}',
']'
]