ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

ファイルを扱う open gsub

ファイルのデータを利用する。
目標とする工程は次のとおり。

  1. Webページから情報をコピーする
  2. 情報をCSVファイルに書きかえる
  3. CSVファイルを指定の書式で出力する


目次


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ファイルの一部。
クルー名は実際のものから変えてあります。

f:id:rowingfan:20180321161033p:plain


赤枠部分にはタブが入力されている。
タブは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ファイルを開く
    • rモードは読み込み用という意味。オプションは省略しているので文字コードUTF-8
    • 開いたファイルを変数sourceに代入する
  • 変数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引数に置きかえる文字列を書く。今回は「レガッタ」に置きかえる
  • 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)