0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby】Fileクラスを用いたファイルへの読み書き -ブロック処理と1文処理-

Last updated at Posted at 2021-04-07

#はじめに
本記事では、ファイルへの読み書きを行う上で便利なRubyのFileクラス

  • File.open()を用い、ブロック内で1行ごと処理
  • File.read(), File,write()による1度に処理

以上の2つについて紹介します。

Rubyを学び始めて1週間の駆け出しが書いていますので、ご指摘やコメント遠慮なくお願いします。

#環境
Ruby 2.7.2
MacOS 11.2.3
#前提
JSONファイルを、値がタブで区切られたテキストファイルへ変換するプログラムを例に挙げています。
カレントディレクトリには以下のファイルが存在します。

meibo.json
[{"name":"john","gender":"m","age":"18"},
 {"name":"paul","gender":"m","age":"20"},
 {"name":"alice","gender":"f","age":"15"},
 {"name":"dabid","gender":"m","age":"17"},
 {"name":"jasmin","gender":"f","age":"17"}]

↑このファイルを↓へ変換します。

meibo.txt
john	m	18
paul	m	20
alice	f	15
dabid	m	17
jasmin	f	17

##File.open()を用いたブロック処理

####手順

  1. JSONファイルを開く
  2. Rubyで扱える形へ変える
  3. テキストを整形する
  4. テキストファイルへ書き込む
json_to_tsv.rb
require "json" # JSONライブラリの読み込み

#json => ruby object
meibo_hash = [{}]
File.open("meibo.json") do |meibo_json_file| # 1. meibo.jsonを開く
  meibo_hash = JSON.load(meibo_json_file) #2. JSON形式の文字列からRubyオブジェクトへ変換
end

File.open("meibo.txt", "w") do |meibo_txt| #欲しいテキストファイル、meibo.txtを作成して開く
  meibo_hash.each do |meibo_hash_person|
    meibo_array = [meibo_hash_person["name"],meibo_hash_person["gender"],meibo_hash_person["age"]] #3. hash => array
    meibo_txt.puts(meibo_array.join("\t")) #4. 1行ずつタブ区切りで配列を結合し、書き込み
  end
end

##File.read(),File.write()による1文処理

####手順

  1. JSONファイルを読み取り、Rubyオブジェクトへ変換
  2. テキストを整形する
  3. テキストファイルへ書き込む
json_to_tsv.rb
require "json"

#json => ruby object
meibo_hash_in_array = JSON.load(File.read("meibo.json")) #JSONファイルを読み取り、Rubyオブジェクトへ変換 

#hash => array [~"\t"~"\t"~"\t"~,..,~"\t"~"\t"~"\t"~]
meibo_text_array = meibo_hash_in_array.map do |person|
                    [person["name"],person["gender"],person["age"]].join("\t") #テキストの整形
                   end

File.write("meibo.txt", meibo_text_array.join("\n")) #meibo.txtへ整形済みテキストを書き込み

ブロック処理したときよりもコードがすっきりしました。
ただし、File.read(),File.write()では1行ずつ処理することができないです。

##最後に
使い分けたほうがよい場面には遭遇していませんが、使う中で書きやすい、読みやすいものを選択できたらと思います。

##参考

Ruby 2.7.0 リファレンスマニュアル ライブラリ一覧 組み込みライブラリ Fileクラス
Qiita マークダウン記法 一覧表・チートシート

本記事を書くにあたって、参考にさせていただきました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?