たとえば以下のようなシラバスに基づく科目情報を考える。
表1: 履修科目データの例
科目名 | 基礎プログラミング |
---|---|
科目コード | 154 |
担当教員 | 鳥海三輔 |
開講時期 | 春学期 |
概要 | プログラミングを通じて問題解決能力を向上を図る。 本講ではRubyを用い,データ処理の構造と考え方の基礎を学ぶ。 |
科目名 | 応用プログラミング |
科目コード | 254 |
担当教員 | 飯森大和 |
開講時期 | 秋学期 |
概要 | 問題解決を通じてプログラミング能力向上を図る。 本講ではプログラミング言語Cを通じて,問題解決に最適なアルゴリズムを 適用する方策を学ぶ。 |
科目名 | 応用もっけ論 |
科目コード | 39 |
担当教員 | 酒田育造 |
開講時期 | 春学期 |
概要 | 山形県庄内地方でよく使われる「もっけ」には様々な意味があり, 他の地域にもこのような多様性を持つ言葉がある。 その成立ちをふまえて正しくその地域の「もっけ」を理解し, 深い交流のきっかけとする。 |
以下同様の項目が多数続く…
このように,形式が同じものが多数あるようなデータを設計し, 検索できるデータベースを作成する過程を示す。
参照されることを前提とした情報は,整理した形で格納する必要がある。 表1のような科目情報がその一例で, 分類された項目に対する値が並んでいる。これを格納するには, ハッシュに情報を格納するときの キー(key)と値(value)の関係がふさわしい。
たとえば,上記の科目の1つは以下のようなハッシュで表現できる。
リスト1: 1科目分のハッシュ表現
kamoku0 = { "科目名" => "基礎プログラミング", "科目コード" => "154", "担当教員" => "鳥海三輔", "開講時期" => "春学期", "概要" => "プログラミングを通じて問題解決能力を向上を図る。 本講ではRubyを用い,データ処理の構造と考え方の基礎を学ぶ。" }
この形式が複数集まったものがデータの集合となる。 つまり,キーと値の組み合わせが一定量集まったものがさらに「値」となり, その複合的な「値」を複数集める, という繰り返しによってデータベースができ上がる。
「キーと値」の組み合わせの集合が複合的な「値」となる
(複合的な)値の集合 | |||||||||||||||||||||||||
|
1科目分の情報は1つのハッシュで表せる。そのハッシュ全体がさらに「値」 となり,それを複数集めることで科目データベースができ上がる。 ハッシュで表現した1科目分の「値」をどのように集めるかについて考察する。
上記のシラバス例をCSV化する。Calc のような表計算ソフトを利用して入力する例を示す。
A | B | C | D | E | |
---|---|---|---|---|---|
1 | 科目名 | 科目コード | 担当教員 | 開講時期 | 概要 |
2 | 基礎プログラミング | 154 | 鳥海三輔 | 春学期 | プログラミングを通して問題… |
3 | 応用プログラミング | 254 | 飯森大和 | 秋学期 | 問題解決を通してプログラミ… |
4 | 応用もっけ論 | 39 | 酒田育造 | 春学期 | 山形県庄内地方でよく使われ… |
「概要」の列は長くて編集しにくいかもしれない。LibreOffice Calc であれば「概要」の列見出し右クリックし、セルの書式設定を選ぶ。 「配置」タブで「テキストを自動的に折り返す」をチェックしてから列幅を 画面に収まる程度にすると多少緩和される。
RubyのCSVライブラリを用いて CSV ファイルをハッシュとしてアクセスできる形式に変換する。syllabus.csv のように1行目が見出しとして構成された CSV ファイルであれば以下の流れで読み取りを行なう。短い手順なので irb で実験してみよう。
require 'csv' => true csv = CSV.read("syllabus.csv", headers: true) => #<CSV::Table mode:col_or_row row_count:4>
通常 CSV.read で得られた値は、あたかも配列のように行ごとに取り出しで きる。見出し行を除く先頭行が添字0となる。
csv[0]
=> #<CSV::Row "科目名":"基礎プログラミング" "科目コード":"154" "担当教員":"鳥海
三輔" "開講時期":"春学期" "概要":"プログラミングを通じて問題解決能力を向上を図る。
\n本講ではRubyを用い,データ処理の構造と考え方の基礎を学ぶ">
このように取り出した行は、 あたかもハッシュのように特定の列の値を取り出せる。
csv[0]["科目コード"]
=> "154"
また、headers オプションを true にしたときはこれに加え、 1行目にある見出し項目をハッシュのキーのように指定することで 列全体を配列として取り出せる。
csv["科目名"]
=> ["基礎プログラミング", "応用プログラミング", "応用もっけ論"]
この様子を示すと以下の図のようになる。
CSV全体をCSV.read
で読み、変数 c
に代入したときのイメージ
列名1 | 列名2 | 列名3 | …… |
値1-1 | 値1-2 | 値1-3 | …… |
値2-1 | 値2-2 | 値2-3 | …… |
: : | : : |
: : | …… |
値n-1 | 値n-2 | 値n-3 | …… |
たとえば、列で縦方向に取り出す場合、c["列名2"]
とすると2列目の値が配列となり、
[値1-2, 値2-2, 値3-2, ..., 値1-2]
が得られる。
以上のしくみをふまえて、ヘッダつきで書かれた CSV ファイルを読み取るプログラムを示す。
#!/usr/bin/env ruby
# coding: utf-8
require 'csv' # CSVライブラリ
csvfile = "syllabus.csv" # シラバス定義CSVファイル
csv = CSV.read(csvfile, headers: true)
# 動作確認用に1行ずつ表示してみる
csv.each {|row|
# ppメソッドはpメソッドよりさらに見やすく値表示する
pp row.to_h # to_h メソッドはハッシュに変換してくれる
}
syllabus.csvを保存してから
上記プログラムを実行してみよ。