💎

【Ruby】JSON to TSV ~ブロック処理と1文処理~

2021/09/25に公開

はじめに

本記事ではファイルへの読み書きを行う上で便利なRubyのFileクラス、以下について紹介します。

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

#環境
Ruby 2.7.2

前提

JSONTSV変換するプログラムを例に挙げています。

[{"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()を用いたブロック処理

手順

  1. JSONファイルを開く
  2. Rubyで扱える形へ変える(JSON to Hash)
  3. テキストを整形する(TSV変換)
  4. テキストファイルへ書き込む
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文処理

手順

  1. JSONファイルを読み取り、Rubyオブジェクトへ変換
  2. テキストを整形する
  3. テキストファイルへ書き込む
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