4

私は一般的にコーディングに非常に慣れていないので、この質問がかなり明白である必要がある場合は、事前にお詫び申し上げます。これが私がやろうとしていることです。それに続いて、これまでに使用したコードを投稿します。

私が開発中の一族のウェブサイトのために、ウェブサイトからgzipされたcsvランクデータを取得してデータベースに保存しようとしています。これを理解したら、5 分ごとにデータを取得する必要があります。私が達成できたcsvデータを取得することはできましたが、それはテキストファイルに保存され、mongodbに保存する必要があります。

これが私のコードです:

var DB        =    require('../modules/db-settings.js');
var http      =    require('http');
var zlib      =    require('zlib');
var fs        =    require('fs');
var mongoose  =    require('mongoose');
var db          =   mongoose.createConnection(DB.host, DB.database, DB.port, {user: DB.user, pass: DB.password});

var request = http.get({ host: 'www.earthempires.com',
                     path: '/ranks_feed?apicode=myapicode',
                     port: 80,
                     headers: { 'accept-encoding': 'gzip' } });
request.on('response', function(response) {
  var output = fs.createWriteStream('./output');

  switch (response.headers['content-encoding']) {
    // or, just use zlib.createUnzip() to handle both cases
    case 'gzip':
      response.pipe(zlib.createGunzip()).pipe(output);
      break;
    default:
      response.pipe(output);
      break;
  }
});

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
  var rankSchema = new mongoose.Schema({
    serverid: Number,
    resetid: Number,
    rank: Number,
    countryNumber: Number,
    name: String,
    land: Number,
    networth: Number,
    tag: String,
    gov: String,
    gdi: Boolean,
    protection: Boolean,
    vacation: Boolean,
    alive: Boolean,
    deleted: Boolean
  })
});

csv の例を次に示します (ファイルの最初の 5 行)。

9,386,1,451,Super Kancheong Style,22586,318793803,LaF,D,1,0,0,1,0
9,386,2,119,Storm of Swords,25365,293053897,LaF,D,1,0,0,1,0
9,386,3,33,eug gave it to mak gangnam style,43501,212637806,LaF,H,1,0,0,1,0
9,386,4,128,Justpickupgirlsdotcom,22628,201606479,LaF,H,1,0,0,1,0
9,386,5,300,One and Done,22100,196130870,LaF,H,1,0,0,1,0
4

1 に答える 1

4

手遅れにならないことを願っていますが、私ができることは次のとおりです。

  1. CSV 形式のデータを要求し、メモリまたはファイルに保存します。
  2. CSV データを解析して、各行をオブジェクトに変換します。
  3. オブジェクトごとに、 を使用Model.create()して新しいエントリを作成します。

まず、スキーマからモデルを作成する必要があります。

var Rank = db.model('Rank', rankSchema);

次に、CSV テキストのブロックを解析できます (ファイルから読み取るか、リクエストの直後に行うかは自由です) data。API にアクセスできないため、独自の偽の変数を作成しましたが、データは改行で区切られた CSV テキストのブロックであるため、これは機能するはずです。

/* Data is just a block of CSV formatted text. This can be read from a file                                                                                                  
   or retrieved right in the response. */                                                                                                                                    
var data = '' +                                                                                                                                                              
    '9,386,1,451,Super Kancheong Style,22586,318793803,LaF,D,1,0,0,1,0\n' +                                                                                                  
    '9,386,2,119,Storm of Swords,25365,293053897,LaF,D,1,0,0,1,0\n' +                                                                                                        
    '9,386,3,33,eug gave it to mak gangnam style,43501,212637806,LaF,H,1,0,0,1,0\n' +                                                                                        
    '9,386,4,128,Justpickupgirlsdotcom,22628,201606479,LaF,H,1,0,0,1,0\n' +                                                                                                  
    '9,386,5,300,One and Done,22100,196130870,LaF,H,1,0,0,1,0\n';                                                                                                            

data = data.split('\n');                                                                                                                                                     

data.forEach(function(line) {                                                                                                                                                
    line = line.split(',');   

    if (line.length != 14)
        return;                                                                                                                                               

    /* Create an object representation of our CSV data. */                                                                                                                   
    var new_rank = {                                                                                                                                                         
        serverid: line[0],                                                                                                                                                   
        resetid: line[1],                                                                                                                                                    
        rank: line[2],                                                                                                                                                       
        countryNumber: line[3],                                                                                                                                              
        name: line[4],                                                                                                                                                       
        land: line[5],                                                                                                                                                       
        networth: line[6],                                                                                                                                                   
        tag: line[7],                                                                                                                                                        
        gov: line[8],                                                                                                                                                        
        gdi: line[9],                                                                                                                                                        
        protection: line[10],                                                                                                                                                
        vacation: line[11],                                                                                                                                                  
        alive: line[12],                                                                                                                                                     
        deleted: line[13]                                                                                                                                                    
    };                                                                                                                                                                       

    /* Store the new entry in MongoDB. */                                                                                                                                    
    Rank.create(new_rank, function(err, rank) {                                                                                                                            
        console.log('Created new rank!', rank);                                                                                                                              
    });                                                                                                                                                                      
});

これをスクリプトに入れて、cron ジョブを使用して 5 分ごとに実行できます。私の Mac では、cron ファイルを で編集し、crontab -e次のような行でジョブをセットアップします。

*/5 * * * * /path/to/node /path/to/script.js > /dev/null
于 2012-12-09T18:30:42.597 に答える