帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:逐行  async  Reader  异步  文件读取  文件  
Asynchronous line-by-line file reader for node.js

  • 源代码名称:line-reader
  • 源代码网址:http://www.github.com/nickewing/line-reader
  • line-reader源代码文档
  • line-reader源代码下载
  • Git URL:
    git://www.github.com/nickewing/line-reader.git
  • Git Clone代码到本地:
    git clone http://www.github.com/nickewing/line-reader
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/nickewing/line-reader
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • 行阅读器

    异步。缓冲。line-by-line文件/流读取器,支持用户定义的行分隔符。

    安装

    npm install line-reader

    用法

    eachLine 函数读取给定文件的每一行。 在每个新行上,使用两个参数调用给定的回调函数: 行读取和布尔值,指定读取的行是否是文件的最后一行。 如果回调返回 false,读取将停止,文件将关闭。

    var lineReader =require('line-reader');lineReader.eachLine('file.txt', function(line, last) {
     console.log(line);
     if (/* done */) {
     returnfalse; // stop reading }
    });

    还可以通过提供第三个回调参数,以异步方式使用 eachLine,如下所示:

    var lineReader =require('line-reader');lineReader.eachLine('file.txt', function(line, last, cb) {
     console.log(line);
     if (/* done */) {
     cb(false); // stop reading } else {
     cb();
     }
    });

    可以提供一个可选的第二个节点样式回调,该回调将在完成( 即使你通过从iteratee返回 false 来手动终止迭代) 时用 (err) 调用或者 ():

    var lineReader =require('line-reader');// read all lines:lineReader.eachLine('file.txt', function(line) {
     console.log(line);
    }).then(function (err) {
     if (err) throw err;
     console.log("I'm done!!");
    });

    对于更细粒度的控件,openhasNextLinenextLine 可能用于迭代文件( 但你必须自己 close ):

    // or read line by line:lineReader.open('file.txt', function(err, reader) {
     if (err) throw err;
     if (reader.hasNextLine()) {
     reader.nextLine(function(err, line) {
     try {
     if (err) throw err;
     console.log(line);
     } finally {
     reader.close(function(err) {
     if (err) throw err;
     });
     }
     });
     }
     else {
     reader.close(function(err) {
     if (err) throw err;
     });
     }
    });

    你可以在 eachLine 或者 open 回调之前在哈希中提供其他选项:

    • separator - string 或者 RegExp 分隔符( 默认为 /rn?|n/ )
    • encoding - 文件编码( 默认为 'utf8' )
    • bufferSize - 缓冲的字节数( 默认为 1024 )

    例如:

    lineReader.eachLine('file.txt', {separator:';', encoding:'utf8'}, function(line, last, cb) {
     console.log(line);
    });lineReader.open('file.txt', {bufferSize:1024}, function(err, reader) {
     ...});

    eachLineopen 支持传递文件名或者读取流:

    // reading from stdinlineReader.eachLine(process.stdin, function(line) {});// reading with file position boundariesvar readStream =fs.createReadStream('test.log', { start:0, end:10000 });lineReader.eachLine(readStream, function(line) {});

    但是请注意,如果从stdin读取用户输入,那么 readline模块可能是更好的选择。

    承诺

    eachLineopen蓝鸟promisify 兼容:

    var lineReader =require('line-reader'),
     Promise=require('bluebird');var eachLine =Promise.promisify(lineReader.eachLine);eachLine('file.txt', function(line) {
     console.log(line);
    }).then(function() {
     console.log('done');
    }).catch(function(err) {
     console.error(err);
    });

    如果你使用的是没有promisify函数的保证库,这里就是你如何做到的:

    var lineReader =require('line-reader'),
     Promise=require(...);vareachLine=function(filename, options, iteratee) {
     returnnewPromise(function(resolve, reject) {
     lineReader.eachLine(filename, options, iteratee, function(err) {
     if (err) {
     reject(err);
     } else {
     resolve();
     }
     });
     });
    }eachLine('file.txt', function(line) {
     console.log(line);
    }).then(function() {
     console.log('done');
    }).catch(function(err) {
     console.error(err);
    });

    贡献者

    • 尼克 Ewing
    • 安迪。爱德华兹( jedwards1211 )
    • Jameson小( beatgammit )
    • Masum ( masumsoft )
    • Caruana Galizia ( mattcg )
    • ) ( ricardohbin )

    Paul还编写了这个 gem的反向版本,可以从下面读取文件: reverse-line-reader

    版权所有 2011尼克 Ewing。



    文章标签:文件  async  异步  Reader  文件读取  逐行  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语