💎
【Ruby】JSON to TSV ~ブロック処理と1文処理~
はじめに
本記事ではファイルへの読み書きを行う上で便利なRubyのFileクラス、以下について紹介します。
-
File.open()
を用い、ブロック内で1行ごと処理 -
File.read()
,File,write()
による1度に処理
#環境
Ruby 2.7.2
前提
JSON
→ TSV
変換するプログラムを例に挙げています。
[{"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"}]
↑このファイルを↓へ変換します。
john m 18
paul m 20
alice f 15
dabid m 17
jasmin f 17
File.open()を用いたブロック処理
手順
- JSONファイルを開く
- Rubyで扱える形へ変える(JSON to Hash)
- テキストを整形する(TSV変換)
- テキストファイルへ書き込む
require "json" # JSONライブラリの読み込み
#json => Hash
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| # 3. 欲しいテキストファイル、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オブジェクトへ変換
- テキストを整形する
- テキストファイルへ書き込む
require "json"
#json => Hash
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 マークダウン記法 一覧表・チートシート
本記事を書くにあたって、参考にさせていただきました。
Discussion