LoginSignup
10
8

More than 5 years have passed since last update.

Rubyでjsonファイルを1行毎に読み込んでパースした話

Last updated at Posted at 2015-05-27

はじめに

こんな感じのファイルがあった

hoge.json
{"id":"1","kana":"あ","boin":"a"
}
{"id":"2","kana":"い","boin":"i"
}
{"id":"3","kana":"う","boin":"u"
}

ここからデータを取りたいと思った。

やってはいけない

最初こんなことをやっていた

suck.rb
require 'json'

json=open('hoge.json'){|io|
 JSON.load(io)
}

json.each_line{|line|
  puts line['kana']
}

意図としては、パースされたhoge.jsonが変数jsonにオールイン。その後、各行ごとに取り出して必要なkeyのvalueをとってこよう、ということ。
しかしこれをやろうとすると、こんな事を言われてしまう。

.../gems/json-1.8.2/lib/json/common.rb:155:in `parse': 795: unexpected token at '{"id":"2","kana":"い","boin":"i"} (JSON::ParserError)

こうしたら動いた

わけがわからず、「1行目はうまく読んでるみたいだから、2行目の記述がだめなのかな?」とか考えていた。しかし、どう見ても変なところがわからない。

そこで、1行ずつ読んだ後で、読んだ1行をパースすることにした。
こんな感じ。

working.rb
require 'json'

# とりあえず変数fileに展開する
file=open('hoge.json')

# fileを1行読む毎にパースして、その上で出力する
file.each_line { |line|
    json=JSON.load(line)
    puts json['kana']
}

すると、

$ ruby working.rb
あ
い
$

とうまくいった。

まとめ

一気にパースしてから各行毎に切り出して...みたいなのはダメらしい。
1行毎に読み込んでから行毎にパースして...というのは大丈夫らしい。
イマイチよくわからないけれども、そういうことらしい。

おわり

10
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8