2015-05-13 66 views
0

我想分割一个文件:每一行在一个单独的文件中。最初的文件非常大。我完成代码波纹管:nodejs:在单独的文件中的每一行

var fileCounter = -1; 

function getWritable() { 
     fileCounter++; 
     writable = fs.createWriteStream('data/part'+ fileCounter + '.txt', {flags:'w'}); 
     return writable; 
} 

var readable = fs.createReadStream(file).pipe(split()); 
readable.on('data', function (line) { 
    var flag = getWritable().write(line, function() { 
     readable.resume(); 
    }); 
    if (!flag) { 
     readable.pause(); 
    } 
}); 

它的工作原理,但它是丑陋的。有没有更好的方式来做到这一点?也许用管道和没有暂停/恢复。

注意:这不是关于lines/files/etc的问题。问题是关于流,我只是试图说明问题

回答

1

您可以使用Node's built-in readline module

var fs = require('fs'); 
var readline = require('readline'); 
var fileCounter = -1; 

var file = "foo.txt"; 
readline.createInterface({ 
    input: fs.createReadStream(file), 
    terminal: false 
}).on('line', function(line) { 
    var writable = fs.createWriteStream('data/part'+ fileCounter + '.txt', {flags:'w'}); 
    writable.write(line); 
    fileCounter++ 
}); 

注意,这将丢失的文件的最后一行是否有结尾没有换行,所以一定要确保你的数据的最后一行后跟一个换行符。

还要注意的是,文件表明,它是稳定指数2,意思是:

稳定性:2 - 不稳定的API是在解决的过程中,但 尚未有足够的实际测试被认为是稳定的。 如果合理,将保持向后兼容性。

0

以下情况如何?你试过了吗?这里暂不需要暂停和恢复逻辑。

var split = require('split'); 
var fs = require('fs'); 
var fileCounter = -1; 

var readable = fs.createReadStream(file).pipe(split()); 
readable.on('data', function (line) { 
    fileCounter++; 
    var writable = fs.createWriteStream('data/part'+ fileCounter + '.txt', {flags:'w'}); 
    writable.write(line); 
    writable.close(); 
}); 

管道动态将是很难......


编辑:您可以创建一个writable(所以pipe()能)对象会,on('data')事件,做到了“创建文件,打开它,写数据时,将其关闭”,但它:

  • 不会遵循KISS princi
    • 不会被重用如果需要文件命名的特殊和特定的逻辑(它会接受一个字符串模式作为它的构造函数中的一个参数,并带有一个数字的占位符。等等......)

    我真的不建议这样的路径,否则你会采取实施非真正可重用模块的年龄。尽管如此,这将使可写实施练习。

  • 相关问题