初めに
node.js の学習のために集計をしてみました。
実際のコードです。
https://github.com/shohei-lob/adding-up.git
環境はLinuxです。
今回すること
「2010 年から 2015 年にかけて 15〜19 歳の人が増えた割合の都道府県ランキング」作成。地域経済分析システム(RESAS:リーサス)で提供されている2010 年と 2015 年の都道府県別 10 代の人口データを集計していきます。データはCSV方式のものです。
要件定義
1.ファイルからデータを読み取る
2.2010 年と 2015 年のデータを選ぶ
3.都道府県ごとの変化率を計算する
4.変化率ごとに並べる
ファイルからデータを読み取る
app.js
'use strict';//ファイルを読み込むconstfs=require('fs');constreadline=require('readline');constrs=fs.createReadStream('.hoge.csv');constrl=readline.createInterface({input:rs,output:{}});rl.on('line',lineString=>{console.log(lineString);});
以下部分が理解するのに苦しみました
rl.on('line', lineString => {
console.log(lineString);
});
部分が理解するのに苦しみました。公式ドキュメントにもあるようにlineが呼ばれるたびに第二引数"lineString"が呼ばれる。
2010 年と 2015 年のデータを選ぶ
app.js
rl.on('line',lineString=>{constcolumns=lineString.split(',');constyear=parseInt(columns[0]);constprefecture=columns[1];constpopu=parseInt(columns[3]);if(year===2010||year===2015){console.log(year);console.log(prefecture);console.log(popu);}});
1行ずつ理解していきます。
lineStringで与えられた文字列をカンマで分割しcolumnsに代入。
const columns = lineString.split(',');
集計年(0 番目),都道府県(1 番目),15〜19 歳の人口(3 番目)をそれぞれ変数に保存しています。
parseInt()は、年と人口を整数値にしています。
const year = parseInt(columns[0]);
const prefecture = columns[1];
const popu = parseInt(columns[3]);
もし年が、2010または2015の場合出力。
if (year === 2010 || year === 2015) {
console.log(year);
console.log(prefecture);
console.log(popu);
}
都道府県ごとの変化率を計算する
集計データは以下3つになる。
・2010 年の人口の合計
・2015 年の人口の合計
・計算された 2015 年の 2010 年に対する変化率
連想配列とオブジェクトの2つのデータ型を使い集計データを表す。
今回はmapを使います。
app.js
'use strict';constfs=require('fs');constreadline=require('readline');constrs=fs.createReadStream('.hoge.csv');constrl=readline.createInterface({input:rs,output:{}});constprefectureDataMap=newMap();// key: 都道府県 value: 集計データのオブジェクトrl.on('line',lineString=>{constcolumns=lineString.split(',');constyear=parseInt(columns[0]);constprefecture=columns[1];constpopu=parseInt(columns[3]);if(year===2010||year===2015){letvalue=prefectureDataMap.get(prefecture);if(!value){value={popu10:0,popu15:0,change:null};}if(year===2010){value.popu10=popu;}if(year===2015){value.popu15=popu;}prefectureDataMap.set(prefecture,value);}});rl.on('close',()=>{console.log(prefectureDataMap);});
以下集計されたデータを格納する連想配列です。
const prefectureDataMap = new Map(); // key: 都道府県 value: 集計データのオブジェクト
以下コードは連想配列 prefectureDataMap からデータを取得しています。
value の値が Falsy の場合に、value に初期値となるオブジェクトを代入します。
changeが null の理由は変化率が0の可能性があるからです。
let value = prefectureDataMap.get(prefecture); //都道府県のデータをとる
if (!value) { // データが取れてない時
value = {
popu10: 0, // 2010年の人口
popu15: 0, // 2015年の人口
change: null //変化率
};
}
全ての行を読み終えた時'close'を呼び出す。
rl.on('close', () => {
console.log(prefectureDataMap);
}
まとめ
APIの使い方を理解していきたいです。
データの型をきっちりしないとエラーが起きる。