当前位置: 首页 > 面试题库 >

在NodeJS中读取文件的第N行

刁英朗
2023-03-14
问题内容

鉴于我知道路径名和行号,因此我尝试提取文件的单行,理想情况下,我希望这样做是在 不读取任何多余文件的情况下进行的

出于我在这里使用的目的,这是异步还是同步都没有关系。

我当前的(不良)实现如下所示:

function get_line(filename, line_no, callback) {
    line_no = parseInt(line_no);
    var data = fs.readFileSync(filename, 'utf8');
    var lines = data.split("\n");
    for (var l in lines) {
        if (l == line_no - 1) {
            callback(null, lines[l].trim());
            return;
        }
    }
    throw new Error('File end reached without finding line');
}

我尝试使用createReadStream进行操作,但是数据事件似乎从未触发。谁能提供直接解决此问题的方法,或者向我指出一些NodeJS文件系统交互文档,该文档比标准库API文档驱动的示例更多?


问题答案:

具有可读流

var fs = require('fs');

function get_line(filename, line_no, callback) {
    var stream = fs.createReadStream(filename, {
      flags: 'r',
      encoding: 'utf-8',
      fd: null,
      mode: 0666,
      bufferSize: 64 * 1024
    });

    var fileData = '';
    stream.on('data', function(data){
      fileData += data;

      // The next lines should be improved
      var lines = fileData.split("\n");

      if(lines.length >= +line_no){
        stream.destroy();
        callback(null, lines[+line_no]);
      }
    });

    stream.on('error', function(){
      callback('Error', null);
    });

    stream.on('end', function(){
      callback('File end reached without finding line', null);
    });

}

get_line('./file.txt', 1, function(err, line){
  console.log('The line: ' + line);
})

直接解决方案:

您应该使用slice方法而不是循环。

var fs = require('fs');

function get_line(filename, line_no, callback) {
    var data = fs.readFileSync(filename, 'utf8');
    var lines = data.split("\n");

    if(+line_no > lines.length){
      throw new Error('File end reached without finding line');
    }

    callback(null, lines[+line_no]);
}

get_line('./file.txt', 9, function(err, line){
  console.log('The line: ' + line);
})

for(var l in lines)不是遍历数组的最有效方法,您应该这样做:

for(var i = 0, iMax = lines.length; i < iMax; i++){/* lines[i] */ }

异步方式:

var fs = require('fs');

function get_line(filename, line_no, callback) {
    fs.readFile(filename, function (err, data) {
      if (err) throw err;

      // Data is a buffer that we need to convert to a string
      // Improvement: loop over the buffer and stop when the line is reached
      var lines = data.toString('utf-8').split("\n");

      if(+line_no > lines.length){
        return callback('File end reached without finding line', null);
      }

      callback(null, lines[+line_no]);
    });
}

get_line('./file.txt', 9, function(err, line){
  console.log('The line: ' + line);
})



 类似资料:
  • 问题内容: 我有一个文本文件: 我想要这样的每一行的第二个和第四个词: 我正在使用此代码: 它可以工作,但是非常复杂,并且需要很长时间来处理长文本文件。 有没有更简单的方法可以做到这一点? 问题答案: iirc: 或者,如评论中所述:

  • 问题内容: 我需要一次最多读取N行来读取一个大文件,直到EOF。在Python中最有效的方法是什么?就像是: 问题答案: 一种解决方案是列表理解和分片运算符: 在这之后是行的元组。但是,这会将整个文件加载到内存中。如果您不希望这样做(即文件可能真的很大),则可以使用生成器表达式和itertools包中的另一种解决方案: 是一个生成器对象,它为您提供文件的每一行,并且可以在这样的循环中使用: 两种解

  • 问题内容: 我对NodeJ很陌生。而且我正在尝试将文件读入变量。这是我的代码。 但每次我运行该脚本,我得到 和 我想念什么?请帮助! 问题答案: 正如您在问题下的注释中所述,节点是异步的-意味着当您调用第二个函数时,您的函数尚未完成执行。 如果在读取文件后将日志语句移动到回调中,则应该看到输出的内容: 即使这将解决您眼前的问题,但如果不了解节点的异步特性,您将遇到很多问题。

  • 本文向大家介绍nodejs读取并去重excel文件,包括了nodejs读取并去重excel文件的使用技巧和注意事项,需要的朋友参考一下 如何使用,直接上代码 解析一下 node-xlsx导出的数据结构如下: 以上就是小编整理的全部内容,很多时候我们用到对EXCEL的文件操作,大家在测试的时候如还有任何疑问可以在下面的留言区讨论,感谢大家对呐喊教程的支持。

  • 问题内容: 我想读取一个非常大的文件的最后n行,而不使用Java将整个文件读入任何缓冲区/内存区域。 我环顾了JDK API和Apache Commons I / O,但无法找到适合此目的的一个。 我在想UNIX中使用tail或更少的方式。我认为他们不会加载整个文件,然后显示文件的最后几行。在Java中也应该有类似的方法。 问题答案: 如果使用,则可以使用和到达文件末尾附近的特定点,然后从那里开始

  • 我使用papa parse读取远程托管的csv文件。问题是头行不在文件的第一行,而是文件以几行空行开始,然后是头行,然后是所有数据。我正在努力让papa parse忽略文件开头的空行。有什么我遗漏的吗?我希望避免加载整个文件(只需要6000多行中的前几行)。