nodejs文件行计数返回undefined

时间:2014-02-14 02:21:16

标签: javascript node.js

我是node.js的新手所以请耐心等待。我需要一个返回文件行长度的函数。 我希望做一些像

这样的事情
file1 = line_length_func('file');
file2 = line_length_function('file');
if (file1 === file2) { console.log('same number of lines!');}

我一直在研究各种方法,使用child.exec(cat文件| wc -l)但是生成子实例会有点复杂。我不知道如何将变量从我的孩子传递给父母,或者如果这样做是好的做法......

所以我试过这个 - 我看到fs.open的fd返回了行数:

function get_lines(file) {
    var lines = fs.open(file, 'r', function(err, fd) {
        var lines = fd;
    });
}

a = get_lines('file.txt');
console.log(a);

但我一直都没有定义。

我接下来尝试的是:(感谢Andrey Sidorov's post

function get_line_count(file) {
    var count = 0;
    fs.createReadStream(file)
        .on('data', function(chunk) {
            for (var i = 0; i < chunk.length; i++)
                if (chunk[i] == 10) count++;
        })
        .on('end', function() {
            return count;
        });
}

var file1_lines = get_line_count('test.txt');
console.log(file1_lines);

但我得到了相同的结果。未定义。

我还不习惯节点,所以任何帮助都会很精彩!谢谢!

更新

行计数似乎现在有效,但我仍然无法编写比较两者的函数。

function get_line_count(file, cb) {
    var count = 0;
    fs.createReadStream(file)
        .on('data', function(chunk) {
            for (var i = 0; i < chunk.length; i++)
                if (chunk[i] == 10) count++;
        })
        .on('end', function() {
            cb(null, count);
        })
        .once('error', cb);
}

var file1 = get_line_count('test.txt', function(err, lines) {
    if (err) return; // todo
    return lines;
});

var file2 = get_line_count('test2.txt', function(err, lines) {
    if (err) return; //todo
    return lines;
});

function same_line_length(len1, len2) {
    return len1===len2;
}

console.log(same_line_length(file1, file2));

这总是回归真实...

3 个答案:

答案 0 :(得分:2)

在文件读取操作开始之前,您的“get_line_count”已完成。它是异步IO,如果这可以帮助考虑命名你的函数“start_file_linecount_sequence(name,oncomplete)” - 该函数将一些请求放入队列并退出(几乎立即),并在稍后的某个时间点从事件循环调用你的处理程序。

function get_line_count(file, cb) {
    var count = 0;
    fs.createReadStream(file)
        .on('data', function(chunk) {
            for (var i = 0; i < chunk.length; i++)
                if (chunk[i] == 10) count++;
        })
        .on('end', function() {
            cb(null, count)
        })
        .once('error', cb);
}

get_line_count('test.txt', console.log);

答案 1 :(得分:1)

在函数get_line_count(file)中,return count用于匿名函数('end'事件处理程序),而不是get_line_count()。所以调用get_line_count()将返回undefined。

假设您有一个需要知道行数的函数:

function doSomething(count) {
  //your code
}

get_line_count的定义更改为:

function get_line_count(file, cb) {
  var count = 0;
  fs.createReadStream(file)
    .on('data', function(chunk) {
        for (var i = 0; i < chunk.length; i++)
            if (chunk[i] == 10) count++;
    })
    .on('end', function() {
        // return count;
        cb(count);
    });
}

最后,请像这样致电get_line_count()

get_line_count(file, doSomething);

答案 2 :(得分:1)

您尝试过的两个函数都使用异步核心方法:fs.createReadStreamfs.open。要从这些函数中获得结果,您必须传递一个回调函数,如下所示:

function getLineCount(file, cb) {
    var count = 0;

    fs.createReadStream(file)
      .on('data', function(chunk) {
        for (var i = 0; i < chunk.length; i++)
        if (chunk[i] == 10) count++;
      })
      .once('error', cb)
      .on('end', function() {
        cb(null, count);
      });
}


getLineCount('example.txt', function(err, count) {
    if (err) return err; // do something about the error
    console.log(count);
});

有关闭包和回调的更多信息:What are Closures and Callbacks?