Ruby

ファイルとJSON

データをプログラム終了後にも残し、安全に読み書きしましょう。

01

パスを組み立てる

Pathnameを使うと、OSの区切り文字を直接書かずにパスを組み立てられます。

パスRUBY
require "pathname"

path = Pathname.new("data") / "message.txt"
puts path
puts path.expand_path
実行例OUTPUT
data/message.txt
/home/user/project/data/message.txt

絶対パスは環境で異なります。相対パスは現在の作業フォルダーが基準です。

02

テキストを読み書きする

フォルダーを作り、UTF-8で保存して読みます。

テキストRUBY
require "fileutils"

FileUtils.mkdir_p("data")
File.write("data/message.txt", "Rubyを勉強中です。\n", encoding: "UTF-8")
content = File.read("data/message.txt", encoding: "UTF-8")
print content
実行結果OUTPUT
Rubyを勉強中です。
上書き File.writeは既存内容を置き換えます。追記はFile.open(path, "a") { |file| file.puts text }を使います。
03

CSVを扱う

値にカンマや引用符が入っても扱えるよう、標準ライブラリのCSVを使います。

CSVの保存と読込RUBY
require "csv"

CSV.open("products.csv", "w", write_headers: true,
         headers: %w[name price], encoding: "UTF-8") do |csv|
  csv << ["りんご", 120]
  csv << ["みかん", 80]
end

CSV.foreach("products.csv", headers: true, encoding: "UTF-8") do |row|
  puts "#{row['name']}: #{row['price']}円"
end
実行結果OUTPUT
りんご: 120円
みかん: 80円
04

JSONを扱う

JSONは配列やハッシュに近い構造を保存できます。生成と解析には標準のjsonを使います。

JSONRUBY
require "json"

users = [{ name: "Mity", age: 20 }]
File.write("users.json", JSON.pretty_generate(users), encoding: "UTF-8")
loaded = JSON.parse(File.read("users.json", encoding: "UTF-8"))
puts loaded[0]["name"]
puts loaded[0]["age"]
実行結果OUTPUT
Mity
20
信頼しすぎない 読み込んだJSONのキーや型が期待どおりか確認します。パスワードや秘密鍵を公開フォルダーへ保存しません。
PRACTICE

ミニ課題:買い物メモ

商品名と個数をハッシュの配列としてJSONへ保存し、次の実行で一覧表示してください。ファイルがない初回は空配列から始めます。