2017-12-17 19 views
0

csvファイルにjsonデータを最初から最後まで追加する必要があります。しかし、1分ごとに各行が追加されます。私の状況では、最初の1分ですべてを追加します。これは私のコードです。csvファイルにjsonデータを1つずつ追加するにはどうすればよいですか?

var unirest = require('unirest'); 
var fs = require('fs'); 
var outFilename = 'mert_akel_minutereadings.csv'; 

var interval = setInterval(function() { post(); }, 60000); //Write to file every minute 

function post(){ 
    unirest.post('https://power.ivyiot.com/Thingworx/Things/GamaNetworkServices/Services/GetNetworkData') 
    .headers({'Accept': 'application/json', 'appKey': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'}) 
    .end(function (response) { 
     writeToCsv(response.body); 
    }); 
} 


function writeToCsv(inJSON){  

     var outCSV = inJSON.rows; 

    // console.log(outCSV) 

     var csv = []; 

     for(var k in outCSV) { 
      var items = [[outCSV[k].PowerPlant , outCSV[k].gen1min , outCSV[k].gen1minDateTime, timeConverter(outCSV[k].gen1minDateTime)]]; 
      for (index = 0; index < items.length; ++index) { 
       csv.push(items[index].join(', ') + '\n'); 
      } 

      fs.writeFile(outFilename, csv, function (err) { 
       if (err) { 
        return console.log(err); 
       } 

       console.log("Added one row!") 

      }); 
     } 

    } 

function timeConverter(UNIX_timestamp){ 
      var a = new Date(UNIX_timestamp*1000); 
      var hour = a.getUTCHours(); 
      var min = a.getUTCMinutes(); 
      var sec = a.getUTCSeconds(); 
      var time = hour+':'+min+':'+sec ; 
      return time; 
    } 

誰でも助けていただければ幸いです。

+0

[fast-csv](https://github.com/C2FO/fast-csv)をご覧ください。具体的には**データの書き込み**セクション –

+1

投稿からの返信が複数の行を返すのではないので、投稿機能の間隔にもかかわらず、CSVに書き込まれる複数の行が表示されます。行のブロックが毎分書き込まれる必要があることを意味していますか? –

+0

あなたの投稿は複数の行を返します。 post()メソッドから受け取った配列配列から1行を挿入するメソッドにintervalを設定しようとします。 – YyYo

答えて

2

最初に、後でsetIntervalを削除します(1分ごとにすべての行を取得する必要はありません)。 次に、間隔を1分ごとに設定して、単一の行を消費します。 メソッドは行を消費し、次の反復のために最後に消費された行のオフセットをkオフセットします。

注:コードはテストされていませんが、作業を行う必要があります。

post機能上のsetIntervalが必要とされていない、それは少し

function post(){ 
    unirest.post('https://power.ivyiot.com/Thingworx/Things/GamaNetworkServices/Services/GetNetworkData') 
    .headers({'Accept': 'application/json', 'appKey': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'}) 
    .end(function (response) { 
     setInterval(writeToCsv(response.body.rows),60000); 
    }); 
} 

function writeToCsv(outCSV){ 
    var k = 0; 
    return function(){ 
    if(k > outCsv.length){ 
    // TODO: stop interval, since no more rows to consume 
    } 
    var items = [[outCSV[k].PowerPlant , outCSV[k].gen1min , outCSV[k].gen1minDateTime, timeConverter(outCSV[k].gen1minDateTime)]]; 
      for (index = 0; index < items.length; ++index) { 
       csv.push(items[index].join(', ') + '\n'); 
      } 

       fs.writeFile(outFilename, csv, function (err) { 
       if (err) { 
        return console.log(err); 
       } 

       console.log("Added one row!") 

      }); 
      k++; 
    } 
} 

function timeConverter(UNIX_timestamp){ 
      var a = new Date(UNIX_timestamp*1000); 
      var hour = a.getUTCHours(); 
      var min = a.getUTCMinutes(); 
      var sec = a.getUTCSeconds(); 
      var time = hour+':'+min+':'+sec ; 
      return time; 
} 

post(); 

`

+0

ありがとうございました! –

1

を助ける願って、これは単にデータを取得維持するつもりです。行を毎分書くと、基本的には遅延を反復的に追加することになります。これにはsetTimeoutを使用する必要がありますが、ループの背後にあるロジックを再作って、setTimeoutがすぐに戻り、互いの間を行き来しないようにする必要があります。

function writeToCsv(rows) { 
    var lineNum = 0; 
    addCSVLine(); //Run the function below; 
    function addCSVline() { 
    var line = rows[lineNum]; //Current line 
    /* 
     Your code here to create the data and add this row to the file 
    */ 
    lineNum++ //Increment our line variable 
    if (lineNum < rows.length) setTimeout(addCSVline, 60000); //recursion, if we haven't reached the last row, run again; 
    } 
} 

ここでは遅延の例を示しますが、わかりやすい理由で遅延が少し追加されています。 - https://jsfiddle.net/ssc8xhjq/

関連する問題