プログラミング奮闘記

難しいと評判!初心者がN予備校でプログラミングを学んだ感想と備忘録!
No.16:集計処理

N予備校 プログラミングコース 第16回

あなたは2019年の目標って立てましたか?
どんな目標を立てたか覚えていますか?

私は2018年末に2019年の目標を立てました。
その一つにプログラミングを学び仕事として使えるようにすることをあげました。
そして、思い立ったが吉日と「N予備校のプログラミングコース」を申し込みました。

そして受講と同時に自身の振替と、これから始めようと考えている人の参考になればとブログを書き始めました。
今回ブログの移設にともない、再度そのブログを読み返しながら、今思うことを加えて記載していきたいと思います。

また私が受講したのは【2018年度】で、現在公開されている【2019年度】との違いについても書いていきたいと思います。

このブログは、初心者が学びながら書いているため、間違っている場合があります。
分かり次第修正していくつもりです。

そのあたりも含め楽しんでいただければと思います。 

最後に進めていてわからなかったところや気になったところをまとめています。

プログラミング入門 webアプリコース 第16回

第三章からは、Webサービス作成を行います。作成するのは秘密の掲示板になります。
今回は、セキュリティの問題のない秘密の掲示板を作成するために、情報からデータを抽出し集計するプログラムについて学びます。
尚、2018年度版と2019年度板では第2項と第3項の順番が逆になっています。

  • 今回の内容まとめ(2018年度版:第3章 02, 2019年度版:第3章 03)
    ・集計処理について

  • 今回の目標
    与えられた情報から必要なデータを抽出し集計をとるプログラムを作成する。

  • 今回新しく扱っているコマンド等
    ・fsモジュール
    ・readlineモジュール
    ・ReadStream
    ・createInterface
    ・lineイベント
    ・split
    ・parseInt
    ・連想配列(Map)
    ・sort関数
    ・Array.from関数
    ・map関数

集計処理について

Node.jsを使って、集計処理プログラムを作成します。

今回は、2010年から2015年にかけて15歳から19歳の人口増加の割合のランキングを作成する集計プログラムを作成します。

今回用いるデータは、日本政府が運営している地域経済分析システム(RESAS)というサイトで提供されている5年ごとの人口推移と予想についてのデータです。
 

モジュールの読み込み

Node.jsには、様々なモジュールというものが用意されています。モジュールにはいろいろな機能が用意されており、それを呼び出して利用することで自分で1から作成する必要がありません。
モジュールを呼び出すコマンドが以下になります。

require (‘○○’)
上記のコマンドで、Node.jsに用意されている○○というモジュールを呼び出すことが出来ます。

今回は、fsモジュールとreadlineモジュールを使用します。

ファイルを扱うモジュール(fsモジュール)

fsは、FileSystemの略で、ファイルを読み込むなどファイルを扱うためのモジュールです。

const fs = require(‘fs’);
このコードはfsモジュールを呼び出す操作の名前をfsと設定しています。

ファイルを読み込むモジュール(readlineモジュール)

readlineモジュールは、ファイルを一行ずつ読み込むためのモジュールです。

const readline = require(‘readline’);
このコードは、redlineモジュールを呼び出す操作の名前をreadlineと設定しています。

ファイルからデータを読み取るプログラムの作成

今回は、fsとreadlineというモジュールを使ってファイルを読み取ります。

ファイルの読み込み

Node.jsでは、読み込みや書き出しなどの入出力に関する処理をStreamという形で扱うことが多いです。
Streamは、ファイルの中身を先頭から順に一つの流れのことで、それをデータとして扱っています。このStreamに対して生じること(イベント)をきっかけに関数を呼び出すなどの処理が行われます。

Streamの作成(crearteReadStream)

createReadStreamは、fsモジュールにある関数で、Steramを生成します。
なお、2018年度版ではcreateReadStreamではなくReadstreamになっています。

const rs = fs.createReadStream(‘○○’);
上記で設定したfs(fsモジュールの呼び出し)の中のcreateReadStreamを○○というファイルに適用します。つまり、○○というファイルを先頭から順に一つの流れとしたデータを作成します。

今回は、○○ファイルのStreamを作成し、それをrsと設定しています。

Streamの読み込み(createInterface)

createInterfaceは、readlineモジュールにある関数で、inputに設定したデータを前から読み込んでいきます。

const rl = readline.createInterface({‘input’: rs, ‘output’:{}});
createInterfaceという作業をrsに適応します。

今回は、上記で作成されたrs(○○ファイルのStream)をInputに設定しているので、rsを前から読み込んでいきます。その読み込んだものをrlと設定しています。

lineイベント

lineは、Stereamに対して起こる一つのイベント、でデータを少しずつ読み込んでいって、一行分に足した時(\nなどの改行文字が現れた時)に発生します。

rl.on(‘line’, (B)=> {
     console.log(B);
});

このコマンドでは、rlに対してlineイベントが発生した時に、この関数が呼び出されます。

今回は、上記で設定したrl(rsを読み込む操作)が一行に達した時、「変数B =その一行分のデータ」ととして、console.log(B)によってBの内容が表示されます。

このlineのようなプログラムをイベントといい、イベントによって関数が呼び出されてりするプログラミングのことをイベント駆動型プログラミングと言います。

尚、’close’イベントは、すべての行を読み終わった時に発生します。 

以上のコマンドを利用することで、ファイルを読み出し表示することが可能になります。

データの選別

ここまでで、ファイルを読み込み書き出すことが可能です。
集計処理を行うためには、読み込んだファイルの中からデータを選別する必要があります。
データの選別は、Streamをいくつかに分割しそれを配列として処理することで行います。

Streamの分割(split)

splitを使うことで、Streamをある文字で分割することができます。

const C = B.split(‘,’);
Bで与えられた文字列をカンマ( , )で分割し、配列に変更します。その配列をCと名付けています。

例えば、Aで与えられる文字列が “12,34,5”であった場合、[“12”, “34”, “5”]の配列に分割されます。

文字列を数値へ変換(parseInt)

parseInt関数を使うことで、文字列を整数値に変換することができます。

上の例であれば、Cは[“12”, “34”, “5”]という文字列として認識されてしまっているのでそれを数値として読めるようにする関数です。

const D = parseInt(C[0]);
上のコマンドは、配列Cの左から2番目([0]が1番目になる)の文字列を整数値に変換します。その整数値にDと言う名前を設定します。

上の例であれば、D=12と言うことになります。

選別したデータの計算

splitとparseIntを用いることで欲しいデータを選別して抽出することができます。
その抽出したデータを使って計算を行うことで集計が行えます。

連想配列(Map)

これまで扱ってきた配列は、添え字(など)が数字になっていましたが、文字列を数字として使うことが可能です。
その時に利用できるのがMapです。この添え字のことをkey、値のことをvalueと言います。

var E = new Map();
E.set(‘あ’, ‘apple’);
E.set(‘う’, ‘cap’);
1行目で、連想配列であるMapを呼び出しており
2行目で、appleに添え字「あ」(key:あ、value:apple)を設定し、
3行目で、carに添え字「う」を(key:う、value:cap)設定しています。

この状態で、

E.get(‘あ’);
E.get(‘い’);
というプログラムを実行すると

1行目は、key「あ」の値を呼び出し

2行目で、key「い」の値を呼び出しています

その結果

‘apple’
undifined
と表示されます。key「あ」の値はappleですが、key「い」については設定していないので、undifined(定義されていません)と表示されています。

計算結果に基づいたデータの並び替え

ここまでのモジュールを用いることによって、データを読み取り、その中から選別したデータを用いて計算を実施しました。
その計算結果を使ってデータを並べます。
そのために今回は、sort関数、Array.from関数を使用します。

配列の並び替え(sort関数)

sort関数では、配列の中身を文字列に変換して文字コード順に並び替えることが出来ます。

var F =[11, 123, 100];
F.sort();
console.log(F);

1行目で、Fという配列を[11, 123, 100]と設定し、
2行目で、F配列を文字コード順に並べ替えて、
3行目で、F配列を表示します。

その結果は下のように表示されます。

[100, 11, 123]
文字列を文字コードに変換して順番に並べているため、前二つの数字を比べて10, 11, 12の順番に並びます。

そこで、比較関数を使うことで昇順・降順に並べ替えることも可能です。 

F.sort(
function(a,b){
return a-b;
}
);
a-bの結果が正の時はaを後ろに、負の時はbを後ろに並べ替えます。

上記の結果を適用すると、

[11, 100, 123]
の順番に並べ替えられます。

配列の作成(Array.from関数)

Array.fromメソッドを用いることで、連想配列Mapのように配列に類似したものを配列に変換することが可能です。

const G = Array.from(E);
さきほど使った連想配列EにArray.from関数を適応し、その配列をGとすると

G = [[あ, apple], [う, cap]]
という配列になります。
 
最後に得られた結果を見やすい形に変形して表示するためにmap関数を使います。

map関数

map関数は、配列の中身を与えられた関数を適用した内容に変換することができます。

var F = [11, 123, 100];
F.map((i) =>{return i*10});
console.log(F);

1行目で、array配列を[11, 123, 100]と設定し、
2行目で、array配列の内容をそれぞれ10倍して、
3行目で、array配列を表示します。

その結果は下のように表示されます。

[110, 1230, 1000]
 

以上で、ある情報から欲しいデータを抽出し、利用したい形に並べ替え、見やすい形で表示することが出来ます。

ここまでの関数を用いることで、5年ごとの人口推移と予想についてのデータを用いて、2010年から2015年にかけて15歳から19歳の人口増加の割合のランキングを作成する集計プログラムを作成することができます。

その他(ブランチの作成とチェックアウト)

今までは、ブランチを作成した後にブランチへ移動(チェックアウト)していました。
今回は、ブランチの作成とチェックアウトを同時に行いました。

git cheskout -b ○○ origin/○○
GitHub上にある○○ブランチを、自分のパソコンに○○というブランチとして持ってきて、そのブランチに移動できます。
git checkout ○○でも可能です。


今回は、情報からデータを抽出し集計するプログラムについて学びました。
Streamなど、今まで聞いたことのない言葉も増えてきたため、理解するのに時間がかかっています。
ここで負けずに続けていきたいと思います。

ABOUT ME
GoodAmbition
オンライン塾経営者(大阪大学工学部出身の元開発技術者) 自身も家庭教師や塾講師として働きつつ、後輩の育成やオンライン塾を経営しています。 私自身も約10年にわたり家庭教師や塾講師として100人以上の受験生と向き合ってきました。 色々な学生、保護者の方とかかわる中でよく質問される内容や、受験に必要な内容について書いています。 独学で頑張っている人たちへ勉強計画や悩み相談なども受け付けていますので気軽にお問い合わせください。 就職活動や資格の勉強などで悩んでいる方もご連絡ください。 教育・就活、書籍、食べ歩きに関するお話がメインです。 最近取り組んでいること プログラミング、筋トレ、マラソン、ライティングスキル向上etc. 苦手なことを克服しようと頑張っています。