ムーのしょ〜もない様でしょ〜もなくもないブログ

プログラミング未経験だけど、エンジニアになりたい、IT関係の仕事がしたい方向けに情報を発信しています!あっ!けどプログラミング以外にも皆さんに有益になる様な情報も発信しますよー!

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

[補足情報] ARGV[1]とARGV[2]はRubyCLIで実行する時に外部のファイルなどの情報を処理するためのものです。  

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

をしたらしっかりと記述されました。