3ステップで学ぶRuby入門
-3ステップで学ぶRuby入門- この参考書の10章の「ファイルを書き換えよう」とゆう問題で つまづいたのでメモ。
Ruby初心者にわかりやすい解説をしてくださってるグラミー先生とゆう方の記事を拝見させてもらいました。
こちらがグラミー先生のサイトです(^ ^)
https://www.grami-sensei.com/
わかりやすく親切丁寧に説明をしてくださっているのでとても参考になりました。グラミー先生ありがとうございます( ´∀`)
グラミー先生の記事を引用させてもらいました。
1.クラスの雛形を記述する
以下のようなクラスの雛形とクラスのインスタンスを
生成して実行するプログラムを記述し、
ファイル名をdata_replacement.rbとして保存します。
class DataReplacement
attr_writer :inputfile, :outputfile
def replace
p 1
end
end
replacement = DataReplacement.new
replacement.inputfile = ARGV[0]
replacement.outputfile = ARGV[1]
replacement.replace
[補足情報1]
ARGV[1]とARGV[2]はRubyをCLIで実行する時に外部のファイルなどの情報を処理するためのものです。
[補足情報2]
attr_writerで書き込み専用のアクセサメソッドを設定しています。
2.クラスの雛形を記述したプログラムを実行する
コマンドライン上で保存したファイルを指定してプログラムを実行します。実行結果に1が表示されます。
$ ruby data_replacement.rb
1
3.ファイル読み込みを実装する
以下のようにreplaceメソッドとcontentsメソッドを記述し保存します。
class DataReplacement
attr_writer :inputfile, :outputfile
def replace
contents.each do |content|
p content
end
end
private
def contents
fail 'Specify inputfile.' if @inputfile.nil?
File.read(@inputfile).split("\n")
end
end
replacement = DataReplacement.new
replacement.inputfile = ARGV[0]
replacement.outputfile = ARGV[1]
replacement.replace
4.元のCSV形式のファイルを用意する
以下のようなCSV形式のデータが記述してファイル名をinputdata.csvで保存します。
山田 太郎,1,09012345678
山田 花子,2,09023456789
鈴木 次郎,1,09034567890
鈴木 桃子,2,09045678901
田中 三郎,1,09056789012
田中 梅子,2,09067890123
高橋 四郎,1,09078901234
高橋 桜子,2,09089012345
佐藤 五郎,1,09090123456
佐藤 李子,2,09001234567
[補足情報]
CSVファイルとは
「CSV」とは “Comma Separated Value” の略で、データをカンマ(” , “)区切った値の事です。アプリケーション間でデータをやり取りする際に使われます。CSV形式で保存されたファイルを「CSVファイル」と呼びます。
CSV形式のファイルは、メモ帳などのテキストエディターで作成することができます。項目と項目の間にカンマを入れてデーターを記入してゆきます。ファイルの拡張子は「csv」で保存します。メモ帳でカンマ区切りのデーターを作成し、「txt」ファイルとして保存すると、それは「CSVファイル」ではなくただの「テキストファイル」になりますので気をつけて下さい。
5.保存したプログラムを引数を指定して実行する
コマンドライン上で以下のようにプログラムを実行します。実行結果がinputdata.csvの中身と同じであることを確認します。
$ ruby data_replacement.rb inputdata.csv
"山田 太郎,1,09012345678"
"山田 花子,2,09023456789"
"鈴木 次郎,1,09034567890"
"鈴木 桃子,2,09045678901"
"田中 三郎,1,09056789012"
"田中 梅子,2,09067890123"
"高橋 四郎,1,09078901234"
"高橋 桜子,2,09089012345"
"佐藤 五郎,1,09090123456"
"佐藤 李子,2,09001234567"
6.名前、性別、携帯電話番号を書き換える処理を記述して保存する
以下のようにプログラムを記述し保存します。
class DataReplacement
attr_writer :inputfile, :outputfile
def replace
contents.map do |content|
name, sex_code, tel = content.split(',')
last_name, first_name = name.split
[last_name, first_name, sex(sex_code), separated_tel(tel)].join(',')
end
end
private
def contents
fail 'Specify inputfile.' if @inputfile.nil?
File.read(@inputfile).split("\n")
end
def sex(code)
code.to_i == 1 ? '男性' : '女性'
end
def separated_tel(number)
number.match(/(\d{3})(\d{4})(\d{4})/)
"#{$1}-#{$2}-#{$3}"
end
end
replacement = DataReplacement.new
replacement.inputfile = ARGV[0]
replacement.outputfile = ARGV[1]
p replacement.replace
7.名前、性別、携帯電話番号を書き換える処理を記述したプログラムを実行する
コマンドライン上で保存したプログラムを以下のように実行します。
実行結果に書き換えた後の行毎の配列が表示されます。
$ ruby data_replacement.rb inputdata.csv
["山田,太郎,男性,090-1234-5678", "山田,花子,女性,090-2345-6789",
"鈴木,次郎,男性,090-3456-7890", "鈴木,桃子,女性,090-4567-8901",
"田中,三郎,男性,090-5678-9012", "田中,梅子,女性,090-6789-0123",
"高橋,四郎,男性,090-7890-1234", "高橋,桜子,女性,090-8901-2345",
"佐藤,五郎,男性,090-9012-3456", "佐藤,李子,女性,090-0123-4567"]
8.ファイルに書き出す処理を追加する
以下のようにプログラムを記述し保存します。
class DataReplacement
attr_writer :inputfile, :outputfile
def replace
output = contents.map do |content|
name, sex_code, tel = content.split(',')
last_name, first_name = name.split
[last_name, first_name, sex(sex_code), separated_tel(tel)].join(',')
end.join("\n")
write_file(output)
end
private
def contents
fail 'Specify inputfile.' if @inputfile.nil?
File.read(@inputfile).split("\n")
end
def sex(code)
code.to_i == 1 ? '男性' : '女性'
end
def separated_tel(number)
number.match(/(\d{3})(\d{4})(\d{4})/)
"#{$1}-#{$2}-#{$3}"
end
def write_file(output)
fail 'Specify outputfile.' if @outputfile.nil?
File.write(@outputfile, output)
end
end
replacement = DataReplacement.new
replacement.inputfile = ARGV[0]
replacement.outputfile = ARGV[1]
replacement.replace
9.ファイルに書き出す処理を追加したプログラムを実行する
コマンドライン上で保存したプログラムを以下のように実行します。
実行結果には何も表示されません。
$ ruby data_replacement.rb inputdata.csv outputdata.csv
[補足情報]
outputdata.csvが生成される。
10.書き出したファイルを確認する
プログラム実行時に指定した書き出し用のファイルである
outputdata.csvを開いて確認します。
inputdata.csvを書き換えた内容が表示されます。
山田,太郎,男性,090-1234-5678
山田,花子,女性,090-2345-6789
鈴木,次郎,男性,090-3456-7890
鈴木,桃子,女性,090-4567-8901
田中,三郎,男性,090-5678-9012
田中,梅子,女性,090-6789-0123
高橋,四郎,男性,090-7890-1234
高橋,桜子,女性,090-8901-2345
佐藤,五郎,男性,090-9012-3456
佐藤,李子,女性,090-0123-4567
試しに自分の名前、性別、番号をinputdata.csvに書き込んでから
$ ruby data_replacement.rb inputdata.csv outputdata.csv
をしたらしっかりと記述されました😚