ファイルを扱う open gsub
ファイルのデータを利用する。
目標とする工程は次のとおり。
目次
CSVファイル
CSVファイルはデータが,
(カンマ)で区切られたテキストデータ。
エクセルなどの表計算アプリに取り込めたり、表計算アプリから書き出せたりもする。
CSVファイルはRubyとも連携しやすいのでデータをCSVファイルにすると何かと便利になる。
データを入手する
今回は日本ボート協会のレース情報を利用する。
注意
Webサイトの情報を利用する場合、個人的に使う以外は著作権法違反になることがあります。
場合によってはWebサイト所有者の許可を得る必要があります。
ボートレース(レガッタ)の結果は、日本ボート協会WebサイトTopページのフッター部分にある「日本ボート協会主催大会」のリンク先にある。
HOME | 公益社団法人 日本ボート協会
https://www.jara.or.jp/
今回は2017年(平成29年)、全日本選手権、男子エイトの結果をコピーする。
Webサイトをみるのに使うブラウザーは「Google Chrome」。
他のブラウザーを使うと違う結果になる場合がある。
コピーの仕方
- Webサイトの該当ページをブラウザに表示させる
- レース結果はRace No毎に表になっている
- レース結果表の部分(Race Noから順位6着のQualifyまで)を全レース分、一気にドラッグで範囲指定してコピーする
- コピーしたらそれをテキストエディタの新規ファイルにペーストする
次の画像はresults_source.txtファイルの一部。
クルー名は実際のものから変えてあります。
赤枠部分にはタブが入力されている。
タブはtabキーで入力された記号。スペースと似ているがスペースとタブの文字コードは別。
カーソルをタブ部分に持っていき、矢印キーで移動させるとスペースより幅が広い1つの記号だとわかる。
ファイルを開く
ファイルを扱うにはopen
メソッドをつかう。
openメソッドのリファレンスマニュアルは次のURLを参照。
Rubyリファレンスマニュアル
Kernelモジュール モジュール関数open
https://docs.ruby-lang.org/ja/latest/class/Kernel.html
つかい方は次のとおり。
open("ファイル名","[モード][:オプション][:オプション]")
[ ]内はどれも省略可能。
[モード]で読み込み用か書き込み用かを指示する。
1つ目の[:オプション]は外部エンコーディング(外部ファイルの文字コード)を指定する。省略したらUTF-8になる。
2つ目の[:オプション]は内部エンコーディング(Rubyコード内の文字コード)を指定する。省略したらUTF-8になる。
テストコードを書く。
results_source.txtと同じディレクトリにtest.rbをつくる。
test.rb
#ファイルを開く source = open("results_source.txt","r") #ファイルを読み込む sourcefile = source.read #読み込んだ内容を出力する puts sourcefile #開いているファイルを閉じる source.close
実行結果は上の画像と同じものがターミナルに表示される。
コードの説明。
open
メソッドでresults_source.txtファイルを開く- 変数sourceを
read
メソッドで読み込んで変数sourcefileに代入する puts
メソッドで読み込んだ変数sourcefileを出力するopen
メソッドで開いたままの変数sourceをclose
メソッドで閉じる
開いたファイルはclose
メソッドで閉じないと不具合をおこす場合がある。
openメソッドはブロックをつけることもできる。
ブロックを使うとclose
メソッドを使わなくてもファイルを閉じてくれる。
gsub!メソッドをつかって文字列を書きかえる
results_source.txtのデータを,
区切りにすることでCSVファイルをつくる。
今回は検索、置きかえを使って,
区切りにする。
検索、置きかえにはgsub
メソッドを使う。
つかい方は次のとおり。
文字列オブジェクト.gsub(/置きかえたいパターン/,'置きかえ後の文字列')
/ /
の中には正規表現(Regular expression)が入る。
正規表現リファレンスマニュアル
正規表現とは文字列をパターンであらわす手法。
正規表現の詳しい説明はRubyリファレンスマニュアルに載っている。
Rubyリファレンスマニュアル
https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html
gsubメソッドを試す
gsub
メソッドを使ったテストコードを書く。
test.rb
sampletxt = "ボート競技はおもしろい" #そのまま出力する puts sampletxt #gsubを使って「ボート競技」部分を書きかえる puts sampletxt.gsub(/ボート競技/,'レガッタ') puts "gsubの場合、元の変数は:#{sampletxt}" #gsub!を使って「ボート競技」部分を書きかえる puts sampletxt.gsub!(/ボート競技/,'レガッタ') puts "gsub!の場合、元の変数も:#{sampletxt}"
実行結果
ボート競技はおもしろい レガッタはおもしろい gsubの場合、元の変数は:ボート競技はおもしろい レガッタはおもしろい gsub!の場合、元の変数も:レガッタはおもしろい
コードの説明。
- 「ボート競技はおもしろい」を変数sampletxtに代入する
puts
メソッドで変数sampletxtを出力する(そのまま表示される)- 変数sampletxtを
gsub
メソッドで書きかえる- 第1引数の
/ /
で「ボート競技」を検索する - 第2引数に置きかえる文字列を書く。今回は「レガッタ」に置きかえる
- 第1引数の
puts
メソッドで表示させる(置きかえられて表示される)gsub
メソッドで書きかえたあと、変数sampletxtを表示させる- 「ボート競技」に戻っているのがわかる。
gsub
メソッドは元の変数を書きかえない
- 「ボート競技」に戻っているのがわかる。
- つづいて変数sampletxtを
gsub!
を使って書きかえる puts
メソッドで表示させる(置きかえられて表示される)- あらためて変数sampletxtを表示させる
- 「レガッタ」に変わっている。
gsub!
メソッドは元の変数も書きかえる
- 「レガッタ」に変わっている。
gsub!
のように一時的でなく完全にオブジェクトを変更させるメソッドを破壊的メソッドと言う。
gsub!メソッドでresults_source.txtをCSV形式に書きかえる。
長くなったので、つづきは次回です。
今回の動作確認環境
Ruby 2.4.3p205
macOS 10.13.3
ターミナル
Google Chrome 65.0(macOS 10)
Windows10
Windows PowerShell
Google Chrome 66.0(Windows10)