you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

re:Ryan Dahl の面接試験:csv データのオブジェクト配列への変換

中島聡さんのブログにある頭の体操をやってみた

所要時間15分くらい

http://satoshi.blogs.com/life/2012/12/ryan-dahl.html

 

JavaScript は Node.js の最新バージョンに使われているものを前提としてください(←ヒント)。

とあるがもっと簡単にできるのかな?とりあえず何も考えずに書いてみた。

 

var http = require('http');
function get(callback){
    var opt = {
        host: 'ichart.finance.yahoo.com',
        port: 80,
        path: '/table.csv?s=AAPL&a=11&b=1&c=2007&d=12&e=1&f=2012&g=m&ignore=.csv',
        method: 'GET',
        agent: new http.Agent({maxSockets: 1})
    };
    var req = http.request(opt, function(res) {
        var data = '';
        res.on('data', function(chunk) {
            data += chunk;
        });
        res.on('end', function() {
            callback(parsecsv(data));
        });
    });
    req.end();
}

function parsecsv(data){
    var begin = 1;
    var count = 0;
    var header = [ ];
    var table = [ ];
    data.toString().split('\n').forEach(function(line){
        if(line !== ''){
            var n = 0;
            var obj = {};
            line.split(',').forEach(function(col){
                if(count >= begin){
                    if(n === 0){
                        obj[header[n]] = col;
                    }else{
                        obj[header[n]] = parseFloat(col);
                    }
                    table.push(obj);
                }else{
                    header.push(col);
                }
                ++n;
            });
        }
        ++count;
    });
    return table;
}

get(function(table){
    // 最終結果表示
    console.log(table);
});

#はてなブログってトラックバックないのか?