csv データのオブジェクト配列への変換
Ryan Dahl の面接試験:csv データのオブジェクト配列への変換(Life is beautiful)
http://ichart.finance.yahoo.com/table.csv?s=AAPL&a=11&b=1&c=2007&d=12&e=1&f=2012&g=m&ignore=.csv
上のURLにアクセスすると、株価データが CSV フォーマットで返って来ますが、これを JavaScript で扱いやすいオブジェクトの配列に変更するプログラムを書いてください。JavaScript は Node.js の最新バージョンに使われているものを前提としてください(←ヒント)。
というわけで、やってみました。
require('http').get('http://ichart.finance.yahoo.com/table.csv?s=AAPL&a=11&b=1&c=2007&d=12&e=1&f=2012&g=m&ignore=.csv', function(res) { var data = ''; res.on('data', function(chunk) { data += chunk; }); res.on('end', function() { console.dir(csvParse(data)); }); }); function csvParse(data) { var rows = data.trim().split('\n').map(function(line) { return line.split(','); }); var labels = rows.shift(); var width = labels.length; return rows.map(function(row) { var obj = {}; obj[labels[0]] = row[0]; for (var i = 1; i < width; ++i) obj[labels[i]] = Number(row[i]); return obj; }); }
console.dir で出力している配列が目的のもの。僕はリダイレクトでファイルに保存して内容を確かめたのだけれど、書き出しまで Node にやらせたいのなら、fs と util モジュールを読み込んでおいて fs.writeFile('table.txt', util.inspect(csvParse(data))) という感じになるだろう。
「JavaScript は Node.js の最新バージョンに使われているものを前提としてください(←ヒント)」のところは、map のような高階関数が利用できるっていう意味だろうか?