我不知道该怎么做。我应该从哪里开始?我已经用谷歌搜索了这个,但没有一个关于如何从文本文件中提取随机行的结果。
我唯一找到的是https://github.com/chrisinajar/node-rand-line,但是它不起作用。如何从文本文件中读取随机行?
我不知道该怎么做。我应该从哪里开始?我已经用谷歌搜索了这个,但没有一个关于如何从文本文件中提取随机行的结果。
我唯一找到的是https://github.com/chrisinajar/node-rand-line,但是它不起作用。如何从文本文件中读取随机行?
您可能希望查看用于读取文件的 node.js 标准库函数fs.readFile,并最终得到以下内容:
const fs = require("fs");
// note this will be async
function getRandomLine(filename, callback){
fs.readFile(filename, "utf-8", function(err, data){
if(err) {
throw err;
}
// note: this assumes `data` is a string - you may need
// to coerce it - see the comments for an approach
var lines = data.split('\n');
// choose one of the lines...
var line = lines[Math.floor(Math.random()*lines.length)]
// invoke the callback with our line
callback(line);
})
}
如果阅读整个内容并拆分不是一种选择,那么也许可以看看这个堆栈溢出的想法。
我有同样的需要从超过 100 Mo 的文件中随机选择一行。
所以我想避免将所有文件内容存储在内存中。
我最终对所有行进行了两次迭代:首先获取行数,然后获取目标行内容。
代码如下所示:
const readline = require('readline');
const fs = require('fs');
const FILE_PATH = 'data.ndjson';
module.exports = async () =>
{
const linesCount = await getLinesCount();
const randomLineIndex = Math.floor(Math.random() * linesCount);
const content = await getLineContent(randomLineIndex);
return content;
};
//
// HELPERS
//
function getLineReader()
{
return readline.createInterface({
input: fs.createReadStream(FILE_PATH)
});
}
async function getLinesCount()
{
return new Promise(resolve =>
{
let counter = 0;
getLineReader()
.on('line', function (line)
{
counter++;
})
.on('close', () =>
{
resolve(counter);
});
});
}
async function getLineContent(index)
{
return new Promise(resolve =>
{
let counter = 0;
getLineReader().on('line', function (line)
{
if (counter === index)
{
resolve(line);
}
counter++;
});
});
}
我可以给你一个建议,因为我没有任何演示代码
buffered reader
int returnRandom(arraySize)
0
数arraySize