2015-01-18 9 views
7

पुन: उपयोग करें, मैं लाइन द्वारा एक फ़ाइल लाइन पढ़ने की कोशिश कर रहा हूं, कुछ क्रियाएं करता हूं जिनमें कॉलबैक होता है और जब फ़ंक्शन लाइन रीड्यूम फिर से शुरू होता है। उदाहरण के लिए:नोडज - फ़ाइल से लाइन द्वारा लाइन पढ़ें, प्रत्येक पंक्ति के लिए एसिंक एक्शन करें और

var fs = require('fs'); 
var readline = require('readline'); 
var stream = require('stream'); 
var instream = fs.createReadStream('./phrases.txt'); 
var outstream = new stream; 
var rl = readline.createInterface(instream, outstream); 
rl.on('line', function (line) { 
    rl.pause(); 
    setTimeout(function() { 
    console.log('resuming'); 
    rl.resume(); 
    }, 2000); 
}); 

मैं यह धारणा थी उपरोक्त उदाहरण मूल रूप से, एक लाइन पढ़ना चाहिए 2 सेकंड, console.log के लिए प्रतीक्षा करें और फिर अगली पंक्ति में जारी है। क्या वास्तव में होता है, कि यह पहली बार 2 सेकंड प्रतीक्षा और फिर वहां से निसृत console.log

उत्तर

1

एक बहुत अच्छी लाइन-रीडर मॉड्यूल मौजूद है के बहुत सारे है https://github.com/nickewing/line-reader

सरल कोड:

var lineReader = require('line-reader'); 
    lineReader.eachLine('file.txt', function(line, last) { 
     // do whatever you want with line... 
     console.log(line); 
     if(last){ 
     // or check if it's the last one 
     } 
    }); 

भी " जावा शैली "अधिक नियंत्रण के लिए इंटरफ़ेस:

lineReader.open('file.txt', function(reader) { 
    if (reader.hasNextLine()) { 
    reader.nextLine(function(line) { 
     console.log(line); 
    }); 
    } 
}); 

एक और शांत समाधान:

var fs = require('fs'), 
    sleep = require('sleep'), 
    readline = require('readline'); 

var rd = readline.createInterface({ 
    input: fs.createReadStream('phrases.txt'), 
    output: process.stdout, 
    terminal: false 
}); 

rd.on('line', function(line) { 
    console.log('-------') 
    console.log(line); 
    sleep.sleep(2) 

}); 
+3

क्या नींद (2) जोड़ने के बारे में इतना अच्छा है? – Dmitri

2

यह कोड आपकी सहायता कर सकता है, अगर उत्तर अच्छा है तो कृपया वोट दें।

function createLineReader(fileName){ 
    var EM = require("events").EventEmitter 
    var ev = new EM() 
    var stream = require("fs").createReadStream(fileName) 
    var remainder = null; 
    stream.on("data",function(data){ 
     if(remainder != null){//append newly received data chunk 
      var tmp = new Buffer(remainder.length+data.length) 
      remainder.copy(tmp) 
      data.copy(tmp,remainder.length) 
      data = tmp; 
     } 
     var start = 0; 
     for(var i=0; i<data.length; i++){ 
      if(data[i] == 10){ //\n new line 
       var line = data.slice(start,i) 
       ev.emit("line", line) 
       start = i+1; 
      } 
     } 
     if(start<data.length){ 
      remainder = data.slice(start); 
     }else{ 
      remainder = null; 
     } 
    }) 

    stream.on("end",function(){ 
     if(null!=remainder) ev.emit("line",remainder) 
    }) 

    return ev 
} 


//---------main--------------- 
fileName = process.argv[2] 

lineReader = createLineReader(fileName) 
lineReader.on("line",function(line){ 
    console.log(line.toString()) 
    //console.log("++++++++++++++++++++") 
}) 
10

Line by Line मॉड्यूल आप बड़े पाठ फ़ाइलें, लाइन द्वारा लाइन पढ़ने, स्मृति में फ़ाइलों बफरिंग के बिना मदद करता है।

आप लाइनों को असीमित रूप से संसाधित कर सकते हैं। इस उदाहरण प्रदान की है:

var LineByLineReader = require('line-by-line'), 
    lr = new LineByLineReader('big_file.txt'); 

lr.on('error', function (err) { 
    // 'err' contains error object 
}); 

lr.on('line', function (line) { 
    // pause emitting of lines... 
    lr.pause(); 

    // ...do your asynchronous line processing.. 
    setTimeout(function() { 

     // ...and continue emitting lines. 
     lr.resume(); 
    }, 100); 
}); 

lr.on('end', function() { 
    // All lines are read, file is closed now. 
}); 
+0

यह वास्तव में तुल्यकालिक है। क्योंकि प्रत्येक पंक्ति को तब तक संसाधित किया जाएगा जब तक कि अंतिम पंक्ति संसाधित नहीं हो जाती? – Pao

+0

यह स्वीकार्य उत्तर होना चाहिए। यह ठीक से हल करता है कि सवाल क्या पूछता है। अपने आप को समझने की कोशिश करने के कई घंटों के बाद, यह वह समाधान है जिसका उपयोग मैंने समाप्त किया। –

+0

यह असली जवाब है। अन्य मॉड्यूल सिर्फ async. होने का नाटक करते हैं। आपको वास्तव में पॉज़ स्ट्रीम की तरह कुछ चाहिए। – mauron85

0
const readline = require('readline'); 
const fs = require('fs'); 

const rl = readline.createInterface({ 
    input: fs.createReadStream('sample.txt') 
}); 

rl.on('line', (line) => { 
    console.log(`Line from file: ${line}`); 
}); 

स्रोत: https://nodejs.org/api/readline.html#readline_example_read_file_stream_line_by_line

+0

यह शायद सबसे अच्छा जवाब है, कोई अतिरिक्त मॉड्यूल आवश्यक नहीं है, सभी मूल node.js मॉड्यूल – Dmitri

+0

हालांकि आपका कोड क्लीनर है, यह कार्यात्मक रूप से प्रश्न में कोड से अलग नहीं है। एक सेटटाइमआउट जोड़ना आपके कोड में बिल्कुल वही है। मैं भी पिछले कुछ घंटों के लिए अपनी समस्या का हल ढूंढ रहा हूं। अगली पंक्ति पर जारी रखने से पहले चल रहे कार्यों को पूरा करने के लिए कोई अच्छा देशी (इनबिल्ट नोडजेज) तरीका प्रतीत नहीं होता है। –

संबंधित मुद्दे

 संबंधित मुद्दे