diff --git a/info/Regular_expression.html b/info/Regular_expression.html index 3584427..b65e5bc 100644 --- a/info/Regular_expression.html +++ b/info/Regular_expression.html @@ -1,390 +1,386 @@ +
- -CSV形式とはあらゆる種類のソフトウェアで読み書きできる「表形式」で表現できるデータのことです。
----
-- -漢字氏名 -カタカナ氏名 -電話番号 -メイルアドレス -住所 -
表の中の各項目が揃った一単位のデータのことをレコードと言います。
上の表では外枠を指します。
- レコードの中にある一つ一つの項目のことをフィールドと言います。
上の表では内枠を指します。
-
表計算ソフトなどでは1レコードを1行に、 1フィールドを1セルに書き込んで表現します。
- 表計算ソフトなどでデータの集合を保存するときはそのソフト固有の保存形式で記録しているため、その保存形式に対応したソフトを使わない限り開くことができません。
- しかしCSV形式はあらゆる種類のソフトウェアで読み書きできる形式です。
csvファイルを作るときは
ファイル名.csvという形で作ります。
CSV形式は複数のフィールドをフィールドごとにカンマ(,)で区切り、 - 1レコードを1行におさめたテキストファイル形式となっています。
-という内容のCSVファイルを作るときに
- Hello,123,”456”,”Hello, World” と表します。
- この場合Hello,Worldにカンマがついています。
- 空白文字かカンマがある場合必ずダブルクォートで括りましょう。
-
He said “Hello”. という文にはダブルクォート(”)が入っています。
- この文を入れてCSVファイルを作るときは
- ”He said ””Hello””.” と表します。
- このように文字列自身にダブルクォートが含まれるときはダブルクォートを重ねて表します。
---
-- -名前 -電話番号 -住所 -職業 -- -公益太郎 -000-0000-0000 -山形県 -学生 -
名前,電話番号,住所,職業
- 酒田太郎,000-000-000,山形県,学生
CSVライブラリとはRubyで使えるCSVファイルを使ってあらゆることを行えるようにする便利道具のようなものです。
- CSVファイルの「読み込み」「書き込み」「1行変換」「全データの繰り返し処理」などを行えます。
CSV ファイルからデータを読むには CSV.read メソッドを使います。
-data(変数) = CSV.read(csvファイル名)
-これを使うとdataという変数に各行の各フィールドごとに配列化したものがさらに配列化されて入る。
+データから文字・文字列を検索するときにそれらのパターンを指定する一般的な表現方法を正規表現といいます。
+ 調べたい文字・文字列が正規表現によってすぐに検索することができます。
+ 例えば、i(小文字)が含まれる文字・文字列の場合以下のように検索されます。
+ ○:i, programming, Application(小文字のiが含まれるので検索される。)
+ ×:I, Image(大文字のIなので検索されない。)
建物名,住所,電話番号
- 羽黒山 五重塔,山形県鶴岡市羽黒町手向,000-000-000
- 加茂水族館,山形県鶴岡市今泉字大久保,999-999-999
-
moji
+ i
+ programming
+ Application
+ I
+ Image
↓このようなCSVファイルをCSV.readで読み込むと配列の配列が返る -
+[["建物名", "住所", "電話番号"],
- ["羽黒山 五重塔", "山形県鶴岡市羽黒町手向", "000-000-000"],
- ["加茂水族館", "山形県鶴岡市今泉字大久保", "999-999-999"]]
-
CSV.readを使うときはCSV ファイルの1行目の見出しを - キーとして値を取り出せる形式で読んだ方が使いやすい。 -
-キーとして値を取り出すとは? -
-連想配列名 = {キー名1 => バリュー1, キー名2 => バリュー2, キー名3 => バリュー3} -
-配列に似ているが配列が要素を指定するのに「0」から始まる添字を使用するのに対し、
- 添字に「キー」と呼ばれる任意の文字列を指定して「バリュー」と呼ばれる要素を指定する。
-
このようなものをHashと言います。
-
- menu = {
-
- "そば" => "300円",
- "ケーキ" => "500円",
- "ハンバーグ" => "800円"
- }
- print menu["そば”]
- lunch = "ハンバーグ"
- print menu[lunch]
-
出力結果
-300円
- 800円
-
このように、Hashでは添字が番号ではなく指定したキーとなっている。
要素を取得する際も、キーを指定することでセットになっている値(バリュー)を取得する。
-
data = CSV.read("shonai.csv", :headers => true) -
-そばは300円である。」というように「そば」と「300円」という2つの言葉が関連付いているときにHashを使うととても便利。 -
-今回作るのはCSV.readを使った観光スポットを検索するプログラムです。
-今回使うファイルはshonai.csvとkankou.rbです。
-
- 建物名,住所,特徴
- 羽黒山 五重塔,山形県鶴岡市羽黒町手向,羽黒山参道、東北北地方では最古の塔といわれている。,
- 白山島,山形県鶴岡市由良2丁目,"由良海岸のシンボルである島。",
- 加茂水族館,山形県鶴岡市今泉字大久保657-1,約1万のミズクラゲがいる「クラゲドリームシアター」がある。,
- 庄内観光物産館 ふるさと本舗,山形県鶴岡市布目字中通80-1,庄内地方をはじめとするお土産を数多く取り揃えている。,
- 酒田米菓(オランダせんべいFACTORY),山形県酒田市両羽町2-24,オランダせんべいFACTORYではその工程を見学できる。,
- 丸池様,山形県飽海郡遊佐町直世荒川57,水深3.5メートル、湧き水だけで満たされた池。,
- 山居倉庫,山形県酒田市山居町1-1-20,庄内のシンボルである山居倉庫。,
- 道の駅「とざわ」高麗館,山形県最上郡戸沢村蔵岡黒淵3008-1,韓国風の外観が特徴の戸沢村にある道の駅。,
-
このcsvファイルを読み込んで取り出していくプログラムを書いていく。
-- require 'csv'# CSVライブラリ読み込み - data = CSV.read("shonai.csv", :headers => true)#観光スポット一覧で使うcsvファイル読み込み - - while true - puts "1 観光スポット一覧" - puts "0 終了" - print "どれかひとつ選んでください => " - input=gets.to_i-
- if input == 0 then #もしinputが0だったとき - break #終了する - elsif input == 1 then #もしinputが1だったとき - #↓行ごとに取り出す - n = 0 - data.each{|row| # rowには1行ずつ値が入り繰り返される - printf("%d: %sとはどんなところ?\n", n+=1, row["建物名"]) - printf("住所 => %s \n特徴 => %s \n",row["住所"], row["特徴"]) - print("--------------------------\n") }#仕切りの機能(何個あってもいい) - else - print "1/0から選んでください\n" +require 'csv'
+
+ data = CSV.read("moji.csv", headers: true)
+ data.each do |row|
+ if /i/ =~ row["moji"]
+ puts row["moji"]
+ end
end - end -
実際にプログラムを動かしてみてね!どう動いたかな?
-プログラムの解説
+ 正規表現:/(スラッシュ)で囲みます。
+ =~:正規表現と文字列のマッチを行います。
書き込みにはCSV.openメソッドを使う。
-CSV.open(ファイル, モード) do |変数|
- :
- : (変数 << によってファイルの中に書き込む処理)
- :
- end
- 書き込む際は、CSV.open メソッドにファイル書き込みオプション "w" または "a" などを与えて行う。 -
-文字・文字列以外に正規表現内で特殊な働きをする文字(メタ文字)で検索することができます。
+ 例えば
中身が空のCSVファイル「sample.csv」があったとします。
-require 'csv'
- CSV.open("sample.csv", "w") do |sample| # csv変数に値を追加すればよい
- sample << ["name", "phone-number"] # << で1行ぶんの配列を指定する
- sample << ["yamada", "000-0000-0000"]
- sample << ["ito", "111-1111-1111"]
- sample << ["saito", "222-2222-2222"]
- sample << ["sasaki", "333-3333-3333"]
- end
name,phone-number
- yamada,000-0000-0000
- ito,111-1111-1111
- saito,222-2222-2222
- sasaki,333-3333-3333
プログラムの解説
- 1行目: 「csv」ライブラリを指定
- 2行目: 「csv」ライブラリのopenメソッドで「sample.csv」ファイルを開く
- 3行目~7行目: CSVデータを書き込み
CSVライブラリを使ってプログラムの幅をどんどん広げていこう!!
+というようにメタ文字を組み合わせることで複雑なデータを検索することができます。
+ ※+と\dについては次の「主なメタ表一覧」を見て、マッチする文字列は何なのか、どのような例があるのか確認してみましょう。
+- - ++
++ +メタ文字 +マッチする文字列 ++ +. +なんでもいい1文字(改行を含まない) ++ +* +直前の文字0回以上の繰り返し ++ ++ +直前の文字1回以上の繰り返し ++ +? +直前の文字0回もしくは1回の繰り返し ++ +文字列1|文字列2 +どちらかにマッチすれば良い ++ +\ +直後のメタ文字を文字としてマッチさせる ++ +\s +空白文字(スペース、タブ、改行など) ++ +\S +空白文字以外 ++ +\d +0〜9の数字 ++ +\D +0〜9の数字以外 +
+++
++ +メタ文字 +正規表現 +マッチする +マッチしない ++ +. +/o.k/ +book +back ++ +* +/.*on/ +nippon +japan ++ ++ +/-+/ +o-------i +oi ++ +? +/ts?u/ +tsu, tu +su ++ +文字列1|文字列2 +/cat|dog/ +cat, dog +fox ++ +\ +/\+/ +10+1 +10-1 ++ +\s +/e\sa/ +We are +Weare ++ +\S +/a\Su/ +aisatu +aisa tu ++ +\d +/\dsai/ +15sai +juugosai ++ +\D +\/Dsai/ +Juugosai +15sai +
name,gakko,gakunen,kozukai
+ 公益太郎,三川八中,2,2000
+ 飯森花子,余目百中,1,4000
+ 鶴岡一人,タキタロウ小,4,200
+ 鶴岡二子,タキタロウ小,2,300
+ 遊佐梅子,丸池小,6,900
require 'csv'
+
+ data = CSV.read("kensaku.csv", headers: true)
+ puts "学校で探す:1"
+ puts "金額で探す:2"
+ print "どれにしますか:"
+ sel = gets.to_i
+
+ if sel == 1
+ print "探したい学校名を入れてください:"
+ ptn = Regexp.new(gets.chomp)
+ #gets.chompで入力された文字列をRegexp.newにより正規表現に直す
+ data.each do |row|
+ if ptn =~ row["gakko"]
+ printf("%sさんは%s%s年です\n", row["name"], row["gakko"], row["gakunen"])
+ end
+ end
+ elsif sel == 2
+ print "絞り込みしたい金額を入れてください:"
+ gaku = gets.to_i
+ data.each do |row|
+ if gaku < row["gozukai"].to_i
+ printf("%sさんは%d円もらっています\n", row["name"], row["kozukai"].to_i)
+ #csvから読んできたデータは全部文字列
+ #数字で比較するときは.to_iや.to_fを使う
+ end
+ end
+ else
+ printf("%d番はありません。さようなら。\n", sel)
+ end
+
+ 正規表現を使ったプログラムを作成してみよう!!
+ + + + \ No newline at end of file diff --git a/info/index.html b/info/index.html index 95beed1..5ba12f5 100644 --- a/info/index.html +++ b/info/index.html @@ -32,6 +32,7 @@