Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8906

node.jsで集計処理をしてみた。

$
0
0

初めに

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の使い方を理解していきたいです。
データの型をきっちりしないとエラーが起きる。


Viewing all articles
Browse latest Browse all 8906

Trending Articles