初めに
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.変化率ごとに並べる
ファイルからデータを読み取る
'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 年のデータを選ぶ
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を使います。
'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の使い方を理解していきたいです。
データの型をきっちりしないとエラーが起きる。