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

<h1>初めに</h1>
node.js　の学習のために集計をしてみました。
実際のコードです。
https://github.com/shohei-lob/adding-up.git　

環境はLinuxです。
<h1>今回すること</h1>「2010 年から 2015 年にかけて 15〜19 歳の人が増えた割合の都道府県ランキング」作成。
<a href="https://resas.go.jp/#/42/42201"> 地域経済分析システム（RESAS：リーサス）</a>で提供されている2010 年と 2015 年の都道府県別 10 代の人口データを集計していきます。データはCSV方式のものです。
<h1>要件定義</h1>
1.ファイルからデータを読み取る
2.2010 年と 2015 年のデータを選ぶ
3.都道府県ごとの変化率を計算する
4.変化率ごとに並べる
#ファイルからデータを読み取る
```app.js
'use strict';
//ファイルを読み込む
const fs = require('fs');
const readline = require('readline');
const rs = fs.createReadStream('.hoge.csv');
const rl = readline.createInterface({ input: rs, output: {} });
rl.on('line', lineString => {
  console.log(lineString);
}); 
```

以下部分が理解するのに苦しみました

```
rl.on('line', lineString => {
  console.log(lineString);
}); 
```
部分が理解するのに苦しみました。<a href="https://nodejs.org/docs/v10.14.2/api/readline.html#readline_event_line">公式ドキュメント</a>にもあるようにlineが呼ばれるたびに第二引数"lineString"が呼ばれる。



#2010 年と 2015 年のデータを選ぶ
```app.js
rl.on('line', lineString => {
  const columns = lineString.split(',');
  const year = parseInt(columns[0]);
  const prefecture = columns[1];
  const popu = 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);
  }
```


#都道府県ごとの変化率を計算する
集計データは以下３つになる。
・2010 年の人口の合計
・2015 年の人口の合計
・計算された 2015 年の 2010 年に対する変化率
連想配列とオブジェクトの２つのデータ型を使い集計データを表す。

<strong>今回はmapを使います。</strong>

```app.js
'use strict';
const fs = require('fs');
const readline = require('readline');
const rs = fs.createReadStream('.hoge.csv');
const rl = readline.createInterface({ input: rs, output: {} });
const prefectureDataMap = new Map(); // key: 都道府県 value: 集計データのオブジェクト
rl.on('line', lineString => {
  const columns = lineString.split(',');
  const year = parseInt(columns[0]);
  const prefecture = columns[1];
  const popu = parseInt(columns[3]);
  if (year === 2010 || year === 2015) {
    let value = 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の使い方を理解していきたいです。
データの型をきっちりしないとエラーが起きる。