#はじめに
本記事では、ファイルへの読み書きを行う上で便利な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()を用いたブロック処理
####手順
- JSONファイルを開く
- Rubyで扱える形へ変える
- テキストを整形する
- テキストファイルへ書き込む
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文処理
####手順
- JSONファイルを読み取り、Rubyオブジェクトへ変換
- テキストを整形する
- テキストファイルへ書き込む
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 マークダウン記法 一覧表・チートシート
本記事を書くにあたって、参考にさせていただきました。