LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

初めに

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';
//ファイルを読み込む
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);
}); 

部分が理解するのに苦しみました。公式ドキュメントにもあるように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);
  }

都道府県ごとの変化率を計算する

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

今回はmapを使います。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0