2015-08-18 15 views
5

Moim zadaniem jest pobranie danych z http://services.swpc.noaa.gov/text/ace-swepam.txt i podzielenie/posortowanie w coś użytecznego. Na początek próbuję podzielić dane na kategorie, aby móc je używać w chart.js lub później, ale gdy próbuję wydrukować pole, po prostu pojawia się jako [].Używanie danych z żądania HTTP w pliku node.js

var options = { 
    host: 'services.swpc.noaa.gov', 
    path: '/text/ace-swepam.txt', 
    port: 80, 

    method: 'POST' 
}; 


var req = http.request(options, function (res) { 


    res.on('data', function (chunk) { 
     // console.log('BODY: ' + chunk); 
     results += chunk.toString(); 
     //split results into an array by each new line 
     lines = results.split("\n"); 
     //delete header lines 
     lines.splice(0, 18); 
     if (lines.length <= 20) { 
      return; 
     } 
     console.log(lines); 

    }); 
    res.on('end', function (e) { 
     callback(); 

    }); 

}); 

req.on('error', function (e) { 
    console.log('problem with request: ' + e.message); 
}); 

req.end(); 

function callback() { 
    for (var line in lines) { 
     var x = []; 
     x = lines[line].split(" "); 
     var statuscode = x[14]; 
     if (statuscode == 0) { 
      if (lines[line].indexOf('-') === -1) { 
       year.push(x[0]); 
       month.push(x[1]); 
       day.push(x[2]); 
       time.push(x[4]); 
       statusno.push(statuscode); 
       proton.push(x[22]); 
       bulksp.push(x[28]); 
       iontemp.push(x[33]); 
      } 
     } 

    } 

    // console.log(year, month, day, time, statusno, proton, bulksp, iontemp) 
} 

Odpowiedz

2

Wiersze danych nie wydają się być rozdzielane tabulatorami. Oczekuję, że są one na stałe.

Oto pierwsza linia, którą otrzymuję. "2015 08 18 1708 57252 61680 0 2.6 45"

Zamiast próbować podzielić ten wiersz za pomocą tabulatora.

fields = line.split("\t"); 

Utwórz tablicę długości każdego pola i podziel ją przy użyciu metody podciągania.

Oto pełny kod parsowania zwracanych danych. Daje 119 linii lub które 6-7 mają status! = 0 (i tak są pomijane). Twoje zmienne mają następnie po 112 wpisów.

res.on('data', function (chunk) { 
    var fieldLengths = [0, 4, 7, 10, 16, 24, 32, 37, 48, 59, 72]; 

    // console.log('BODY: ' + chunk); 
    results += chunk.toString(); 
    //split results into an array by each new line 
    lines = results.split("\n"); 

    // for me, the first "chunk" is incomplete. Throw it away and just use the second chunk. 
    if (lines.length <= 20) { 
     return; 
    } 

    //delete header lines 
    lines.splice(0, 18); 

    for (var line in lines) { 
     console.log("entry: " + lines[line]); 
     //split into data fields 
     var lineText = lines[line]; 
     var fields = []; 
     for (var i = 0; i <= fieldLengths.length -1; i++) { 
      fields.push(lineText.substring(fieldLengths[i], fieldLengths[i + 1])); 
     } 

     //if there are no problems (status code 0) 
     //add the data to their respective fields 
     if (fields[6] == 0) { 
      year.push(fields[0]); 
      month.push(fields[1]); 
      day.push(fields[2]); 
      time.push(fields[3]); 
      statusno.push(fields[6]); 
      proton.push(fields[7]); 
      bulksp.push(fields[8]); 
      iontemp.push(fields[9]); 
     } 
    } 
}); 
res.on('end', function (e) { 
    console.log(year); 
}); 

});

To jest łatwe do debugowania, jeśli używasz Visual Studio (darmowa edycja społeczności będzie działać) i dodać narzędzia węzła dla visual studio.

Daj mi znać, jeśli dane nie są prawidłowe. Rozumiem, co próbujesz zrobić i możesz poprawić kod, jeśli to konieczne.

+0

Dziękuję, jesteś wspaniałą osobą, ty :) –

+1

Oczywiście! Czy możesz zaznaczyć to jako odpowiedź, jeśli działa dla Ciebie. –

+0

Przepraszam, tak, nigdy nie korzystałem z tej strony, więc nie mam pojęcia, co robię. Poprosiłem o to faceta poniżej, ale ja też cię o to poproszę - pracuję z podciąganą metodą, która jest genialna, ale to tylko jazda rowerem przez pierwsze 30 lub więcej (1725 - 1824 dla mnie) płyty trzy razy, zamiast zbierać WSZYSTKIE dane raz. Jakieś oczywiste powody, dla których możesz zobaczyć, dlaczego to robi? –

1
function callback() { 
    for (var line in lines) { 

     //split into data fields 
     year.push(lines[line].substring(x,y));//fill in x and y 
     //month.push.. 
     //day.push.. 
     } 
} 

lub

callback() { 
var x = []; 
for (var line in lines){ 
x = lines[line].split(" "); 
console.log(x); 
year.push(x[index]) // index being where year was split into x 

    } 
} 

wystarczy umieścić tę funkcję w res.on ('end'). Nie jestem w 100% pewien, co dokładnie robisz, mam nadzieję, że to pomoże.

EDIT:

var options = { 
host: 'services.swpc.noaa.gov', 
path: '/text/ace-swepam.txt', 
port: 80, 

method: 'POST' 
}; 


var req = http.request(options, function (res) { 


res.on('data', function (chunk) { 
    // console.log('BODY: ' + chunk); 
    results += chunk.toString(); 
    //split results into an array by each new line 
    lines = results.split("\n"); 
    //delete header lines 
    lines.splice(0, 18); 

}); 
res.on('end', function (e) { 
    callback(); 

    }); 

}); 

req.on('error', function (e) { 
console.log('problem with request: ' + e.message); 
}); 

req.end(); 

function callback() { 
for (var line in lines) { 
var x = []; 



x = lines[line].split(" "); 
//console.log(x); Print x and see which index of x has the vaule you want. Constant for all 
year.push(x[0]); 
month.push(x[1]); 
day.push(x[2]);  
time.push(x[4]); 






    } 
    //console.log(year,month,day,time); Check final result 

} 
+0

Dzięki!:) Pracuję z podciąganą metodą, która jest genialna, ale jest tylko jazda na rowerze przez pierwsze 30 lub więcej (1725 - 1824 dla mnie) rekordów, trzy razy, zamiast otrzymywać WSZYSTKIE dane raz. Jakieś oczywiste powody, dla których możesz zobaczyć, dlaczego to robi? –

+1

Będę edytować moją odpowiedź z kodem dla mojego rozwiązania. Który przemierza wszystkie wiersze danych w witrynie, co wydaje się być aktualizacją. – Joey

+1

Pobiera wszystkie dane z witryny i przetwarza je na x. Możesz wydrukować X i sprawdzić, w jakim indeksie znajduje się twoja wartość (będzie stała dla wszystkich wierszy, ponieważ ten sam odstęp). Zrobiłem to do czasu, ponieważ jest to pierwszy, który jest inny. – Joey

Powiązane problemy