Ruby – ファイル操作 – CSV

ライブラリーの読み込み

ライブラリーのcsvを読み込む。

require "csv"

CSVファイルの書き込み

ファイルのオープン

モードを指定してファイルを開き、CSVオブジェクトを取得(モードはファイル操作を参照)。

csv = CSV.open("ファイル名", "モード")

行単位の書き込み

カラム数を要素数とする配列でputs()メソッドを使う。

csv.puts([col1, col2, ... ])

'<<'演算子でもよい。

csv << ([col1, col2, ... ]

ファイルのクローズ

csv.close

CSVファイルの読み込み

ファイルのオープン/クローズは不要で、read()メソッドで直接一括読み出し。

array = csv.read

結果は2次元配列で、行数がレコード数、列数がカラム数。

 

Ruby – 日付と時刻

現在時刻

現在時刻はTimeクラスのnowメソッドで取得。

Time.now

フォーマッティング

Timeクラスのstrftime()メソッドで日付・時刻を書式整形した文字列が得られる。

time.strftime("書式文字列")

典型的な書式の例

time.strftime("%Y/%m/%d %H:%M:%S")

 

Rails – 基本操作

ビューの記述

コントローラー作成時にアクションを指定した場合

ビューは以下のHTMLファイルに準備されているので、その内容をHTMLで記述する。

app/views/controller_name/action_name.html.erb

あとからアクションを追加する場合

以下のファイルを作成し、その内容をHTMLで記述する。

app/views/controller_name/action_name.html.erb

各ビューに共通するビュー

各ビューのファイルはbodyタグの中だけを書くが、HTML全体の枠組みやHEAD要素など各ビューに共通の内容は以下のファイルに書かれている。

app/views/layouts/application.html.erb

SCSS

コントローラーごとに以下のSCSSファイルでスタイル指定する。

app/assets/stylesheets/controller_name.scss

stylesheetsディレクトリー下のSCSSファイルは全てのビューに適用される。

フォーム送信

HTML

HTMLのformタグの代わりにヘルパーメソッドが使える。

<%= form_tag("送信先URL") do %>
<% end %>

送信先URLは"/controller_name/action_name"のような形で指定する。form_tagメソッドはデータをPOST形式で送る。

routes.rb

また、POSTに対して指定したメソッドが起動するようにroutes.rbでルーティングを設定する。

post '/controller_name/action_name', to:'controller_name#action_name'

controller_name_controller

コントローラーのファイルでで定義されているコントローラークラスにアクションメソッドを追加する。

この段階でもsubmitボタンを押すとコンソールでデータが渡されているのが確認できる。

 

Ruby – ファイル操作

要点

  • Fileクラスを使うことで、開いたファイルをオブジェクトとして扱える
  • Fileはopenメソッドで開き、closeメソッドで閉じる
  • openメソッドで開いたファイルオブジェクトに対して、行単位の読み込みなどの処理を行う

ファイルのオープン/クローズ

ファイルのオープンにはFile#openメソッドを使う。第1引数でファイルのパス、第2引数でファイルを開くモードを文字列で指定。

変数 = File.open("ファイルへのパス", "モード")

モード指定の例は以下の通り。

"r" 読込 デフォルト
"w" 書込 ファイルが存在している場合は内容を空にする
"a" 追加 ファイルが存在している場合は末尾に追加する
"r+" 読書 ポインターはファイルの先頭にセット
"w+" 読書 ファイルが存在している場合は内容を空にする
"a+" 読書 読込位置は先頭、書き込み位置は末尾にセット

ファイルのクローズにはcloseメソッドを使う。

ファイルオブジェクトの変数.close

以下はファイル名を指定してファイルを開き、何もせずにクローズする例。

以下の構文は、ファイルのクローズを明示しなくても完結する。

ただしこれには注意が必要。このブロックの中で定義した変数でファイルの内容を読み込むと、ブロックの外ではその変数は使えない(ブロック内スコープ)。

ブロック内で読んだ内容を外で参照するためには、ブロック外で変数が定義されている必要がある。

ファイルの読み込み

一括読込

ファイルの読み込みは、ファイルオブジェクトのreadメソッドを使う。

行ごとの読み込み

Fileオブジェクトのeach_lineメソッドを使うと、行単位で読み込んでくれる。

行番号

Fileオブジェクトのlinenoプロパティーは、現在読んでいる位置の行番号を持っている。

ファイルの書き込み

ファイルの書き込みはopenの第2引数で"w"を指定する。ファイルが存在すればその内容が空にされ、ファイルが存在しなければ新たに作られる。

 

Ruby – ハッシュ

ハッシュの定義

ハッシュは{}で囲み、key => valueをカンマで連ねて定義する。

空のハッシュは次のいずれかで。

ハッシュのサイズ

ハッシュのサイズはsizelengthで取得。

ハッシュが空かどうかはempty?で確認できる。

キーと値のリスト

keysvaluesでキーや値のリストが得られる。

キーと値の検索

has_key?、has_value?でキーや値の存在を確認。

値の参照・追加・変更

キーを指定して値を参照。存在しない場合はnil

新たなキーを指定してアイテムを追加。

キーを指定してアイテムを削除。

キーを指定して値を変更。

キーと値の順次取り出し

eachメソッドでキーと値のセットを順次取り出す。

シンボルによるキーの設定

:key => valueの形で、キーをシンボルで設定できる。

シンボルで設定する場合、key: valueの形でも設定できる。ただし参照する場合は:keyの形で。

キーのリストもシンボルで表示される。

 

Ruby – chop/chop!~末尾文字の削除

chopは文字列の末尾1文字を削除する。

末尾に改行文字がある場合は、それらが削除される。ただし"\n\r"の場合だけは"\n"が削除されずに残る。

chopは非破壊的であり、元の文字列は変更されない。

chop!にすると破壊的メソッドになり、戻り値も変更後の文字列。

 

Ruby – 配列の演算

概要

Rubyの配列同士の演算はPythonのようにブロードキャストされない。加算/減算はそれぞれ和集合/差集合のように扱われる。

配列同士の加算

+~加算は和集合

配列同士をで加算すると双方の和集合となる。

必ずしも重複が削除されるわけではない。

~減算は差集合

減算の場合、元の配列から重なる要素だけが削除される。下の例ではabに共通な[3, 4]が削除され、[5, 6]はもともとaに含まれていないので無視される。

積集合の求め方

加算と減算を組み合わせて、2つの配列の席集合に相当する配列が得られる。

要素の追加

<<演算子は左辺の配列に右辺の要素を追加する。連続して複数の要素も追加可能。push()と同じ動作。

 

Ruby – 配列メソッド

概要

配列オブジェクトのメソッドのには破壊系と非破壊系があり、注意を要する。

パラメーター系

size/length~要素数の取得

sizeメソッド、lengthメソッドとも配列の要素数を返すエイリアス。

sum~合計値の取得

sumメソッドは配列要素の合計値を返す。

要素抽出系

first/last~先頭要素/末尾要素の取得

firstメソッドは配列の先頭の要素、lastメソッドは末尾の要素を返す。

sample~ランダムな要素取得

sampleメソッドは配列からランダムに1つ要素を返す。引数を指定すると重複なしでその個数分のサンプル配列を返すが、引数が要素数を超えた場合は全要素がランダムに並べられた配列が返される。

破壊的メソッド

push/unshift~要素の追加

pushメソッドは配列の末尾に要素を追加し、unshiftメソッドは配列の先頭に要素を追加する。いずれも元の配列を変更する(要素の追加は<<演算子でもできる)。

pop/shift~要素の取出し

popメソッドは配列の末尾から要素を取り出し、shiftメソッドは配列の先頭から要素を取り出す。いずれも元の配列が変更され、取り出された要素が戻り値となる。

非破壊的メソッド

reverse~要素の順番の反転

reverseメソッドは、元の配列の要素の順番を反転した配列を新たに生成して返す。

sort~昇順ソート

sortメソッドは、元の配列を昇順でソートした配列を生成して返す。文字列オブジェクトの場合は辞書順で、大文字→小文字の順。

sort.reverse~降順ソート

sortメソッドとreverseメソッドの組み合わせで、降順にソートされた配列が生成されて返される。

uniq~重複要素の削除

uniqは配列中の重複した要素を削除して1つにし、重複のない配列とする。元の配列は変更されず、新たな配列が生成される。

shuffle~要素のシャッフル

shuffleメソッドは、元の配列の要素をランダムに並べ替えた配列を生成して返す。

文字列化・配列化

split~文字列の配列への分解

splitメソッドは、指定した文字列で元の文字列を区切って、それぞれが要素となる配列を生成する。

join~配列要素の文字列への結合

joinメソッドは、配列の各要素を指定した文字列でつないだ文字列を生成する。

 

Ruby – 文字列メソッド

length~文字列の長さ

半角も全角も1文字。

結合系

+~文字列の連結

+演算子は文字列同士を結合する。半角と全角の連結もok。

join~配列要素の文字列化

配列のメソッドだが、joinメソッドは配列要素を指定した文字列で結合して文字列にする。

分割系

split~文字列の配列への分割

引数で指定した文字列で元の文字列を分解して配列化。

2つ目の例から、引数で指定した文字列"--"が見つかるたびに、そこまでの文字列を要素として配列に加えていることがわかる。

削除系

delete~特定の文字の削除

引数で指定した文字列を削除。

strip~前後のスペースの削除

半角スペースを削除。全角スペースは削除されない

chop/chop!~末尾文字の削除

chop/chop!は末尾文字を削除する。

chomp/chomp!~末尾の改行文字の削除

chomp/chomp!は末尾文字を削除する。

変換系

upcase/downcase~大文字化/小文字化

アルファベットの大文字化/小文字化。

 

Ruby – コメント

1行コメント~#

文頭に'#'があると、以降行末までコメントになる。

複数行コメント~=begin/=end

=begin=endの間の行は埋め込みドキュメントとして実行時には無視される。=begin=endはそれぞれ行頭になければならない。

__END__の応用

__END__はコードの終端を示し、それ以降の記述は実行対象にならない。