ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

Ruby on Rails - Zipファイルを読み込む。Jsonを解析する。

先の記事と同様、タイトル通りのサンプルを作ってみました。
こちらもモジュールとしていたので、備忘録として載せておきます。

とはいっても、Zipファイルの読み込みは
ほぼ下記サイトを参考にさせて頂きました。
http://blawat2015.no-ip.com/~mieki256/diary/201312292.html

Gemfile

gem 'rubyzip' 

モジュール


require 'zip'
require 'json'
require 'kconv'

module ZipData
def self.read(file_path)
content = get_file_content(file_path)
json = JSON.parser.new(content)
return json.parse()
end

private
def self.get_file_content(file_path)
bindata = {}
Zip::File.open(file_path) do |zipfile|
zipfile.each do |f|
name = f.name
size = f.size
next if name =~ /\/$/ # ディレクトリは除外
bindata[name] = zipfile.read(f.name)
end
end

content = bindata[File.basename(file_path, '.zip') + '.json']
return content.toutf8()
end
end

gemはrubyzip 1.1.0を使いました。
バージョンにより、使用できるメソッドが異なっていたため
Gemfileでバージョンを指定してインストールする必要があるかもです。

ziprubyというgemもありますが、こちらはRuby2.0では使えないようです。

get_file_content()でzipファイルの中身を読み込んでいます。
読み込んだ中身を、toutf8()でutf-8形式に変換しないと
後続のjson.parse()が上手く行かないようです。

read()では、zipファイルの中身のjsonjson.parse()でhashに変換して
返却しています。

ファイルの内容はhashになってしまえば、あとはhashオブジェクトの操作で
自由自在に扱うことができます。