2015-11-12 4 views
3

новый для узла JS, все еще привыкший к тому, как все сделано. Я обрабатываю файл с этой структурой:Вызывает заказ в узле js

[1447113604] [104] [86] 
[1447113605] [111] [91] 
[1447113606] [127] [114] 
[1447113607] [115] [105] 
[1447113608] [120] [101] 
[1447113609] [105] [100] 
[1447113610] [89] [88] 

Я прочитал его построчно, разобрать каждую строку и создать и объект, который имеет 3 свойства (метки времени, count1, count2), а затем добавить новый объект к массиву, в конце я хочу пройти через массив и напечатать его элементы с циклом for.

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

var arr_counters = []; 

var rl = readline.createInterface({   
     input : fs.createReadStream("cps.log"), 
     output: process.stdout, 
     terminal: false  
}) 

rl.on('line',function(line){ 
    console.log(line) //or parse line 
    var tokens = line.split(" "); 

    var str_TS = tokens[0].substring(1,11); //strip '[' ']' 
    var int_p = tokens[1].substring(1, tokens[1].length - 1); //strip '[' ']' 
    var int_c = tokens[2].substring(1, tokens[2].length - 1);//strip '[' ']' 

    console.log(str_TS.toString()); 
    console.log(int_p.toString()); 
    console.log(int_c.toString()); 

    var counter = { 
     timestamp: parseInt(str_TS), 
     PCount: parseInt(int_p), 
     CCount: parseInt(int_c) 
    } 
    arr_counters.push(counter); 
}) 

for (var index = 0; index < arr_counters.length; index++) 
    console.log(arr_counters[index]); 

Но последние 2 строки, казалось, пропустил, я не могу видеть элементы массива: Это выходной ток:

E:\Node-JS>node read_file2.js 
[1447113604] [104] [86] 
1447113604 
104 
86 
[1447113605] [111] [91] 
1447113605 
111 
91 
[1447113606] [127] [114] 
1447113606 
127 
114 
[1447113607] [115] [105] 
1447113607 
115 
105 
[1447113608] [120] [101] 
1447113608 
120 
101 
[1447113609] [105] [100] 
1447113609 
105 
100 

Если я устанавливаю для цикла сразу после нажав объект в массиве, я вижу их как они добавляются на каждой итерации, вопрос в том, как я могу получить доступ к массиву правильно после того, как он был заполнен объектами?

ответ

1

Проблема в том, что ваш цикл работает до того, как ваш readLine завершит разбор. Вы должны вызывать свой цикл только после того, как весь файл проанализирован с помощью события close.

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

var arr_counters = []; 

var rl = readline.createInterface({   
     input : fs.createReadStream("cps.log"), 
     output: process.stdout, 
     terminal: false  
}) 

rl.on('line',function(line){ 
    console.log(line) //or parse line 
    var tokens = line.split(" "); 

    var str_TS = tokens[0].substring(1,11); //strip '[' ']' 
    var int_p = tokens[1].substring(1, tokens[1].length - 1); //strip '[' ']' 
    var int_c = tokens[2].substring(1, tokens[2].length - 1);//strip '[' ']' 

    console.log(str_TS.toString()); 
    console.log(int_p.toString()); 
    console.log(int_c.toString()); 

    var counter = { 
     timestamp: parseInt(str_TS), 
     PCount: parseInt(int_p), 
     CCount: parseInt(int_c) 
    } 
    arr_counters.push(counter); 
}) 


rl.on('close',function(){ 
    for (var index = 0; index < arr_counters.length; index++) 
     console.log(arr_counters[index]); 
}); 
+0

спасибо, это работает – user3196371