データの格納と表現例

たとえば以下のようなシラバスに基づく科目情報を考える。

表1: 履修科目データの例

科目名基礎プログラミング
科目コード154
担当教員鳥海三輔
開講時期春学期
概要 プログラミングを通じて問題解決能力を向上を図る。 本講ではRubyを用い,データ処理の構造と考え方の基礎を学ぶ。
科目名応用プログラミング
科目コード254
担当教員飯森大和
開講時期秋学期
概要 問題解決を通じてプログラミング能力向上を図る。 本講ではプログラミング言語Cを通じて,問題解決に最適なアルゴリズムを 適用する方策を学ぶ。
科目名応用もっけ論
科目コード39
担当教員酒田育造
開講時期春学期
概要 山形県庄内地方でよく使われる「もっけ」には様々な意味があり, 他の地域にもこのような多様性を持つ言葉がある。 その成立ちをふまえて正しくその地域の「もっけ」を理解し, 深い交流のきっかけとする。

以下同様の項目が多数続く…

このように,形式が同じものが多数あるようなデータを設計し, 検索できるデータベースを作成する過程を示す。

情報をデータ化する表現形式

参照されることを前提とした情報は,整理した形で格納する必要がある。 表1のような科目情報がその一例で, 分類された項目に対する値が並んでいる。これを格納するには, ハッシュに情報を格納するときの キー(key)と値(value)の関係がふさわしい。

たとえば,上記の科目の1つは以下のようなハッシュで表現できる。

リスト1: 1科目分のハッシュ表現

kamoku0 = {
  "科目名"	=> "基礎プログラミング",
  "科目コード"	=> "154",
  "担当教員"	=> "鳥海三輔",
  "開講時期"	=> "春学期",
  "概要"	=> "プログラミングを通じて問題解決能力を向上を図る。
本講ではRubyを用い,データ処理の構造と考え方の基礎を学ぶ。"
}

この形式が複数集まったものがデータの集合となる。 つまり,キーと値の組み合わせが一定量集まったものがさらに「値」となり, その複合的な「値」を複数集める, という繰り返しによってデータベースができ上がる。

「キーと値」の組み合わせの集合が複合的な「値」となる

(複合的な)値の集合
これ全体が「値」
キー11a
キー22a
キー33a
これ全体が「値」
キー11c
キー22c
キー33c
これ全体が「値」
キー11b
キー22b
キー33b

1科目分の情報は1つのハッシュで表せる。そのハッシュ全体がさらに「値」 となり,それを複数集めることで科目データベースができ上がる。 ハッシュで表現した1科目分の「値」をどのように集めるかについて考察する。

CSVファイルとの連携

上記のシラバス例をCSV化する。Calc のような表計算ソフトを利用して入力する例を示す。

syllabus.csv

ABCDE
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 に代入したときのイメージ

c["列名1"]
c["列名2"]
c["列名3"]
列名1 列名2 列名3 ……
1-1 1-2 1-3 …… ⇐ c[0]
2-1 2-2 2-3 …… ⇐ c[1]
:
:
:
:
:
:
……
n-1 n-2 n-3 …… ⇐ c[n]

たとえば、列で縦方向に取り出す場合、c["列名2"] とすると2列目の値が配列となり、

[値1-2, 値2-2, 値3-2, ..., 値1-2]

が得られる。

CSVファイルの読み取りプログラム

以上のしくみをふまえて、ヘッダつきで書かれた CSV ファイルを読み取るプログラムを示す。

csv-read.rb

#!/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を保存してから 上記プログラムを実行してみよ。


本日の目次