一昨日書いた記事に次のようなコードを乗せました。
実はこれにはある種の欠陥がありました。
上記コードにおいて、出力を整える部分で次のように書いたのですが……
puts res.scan(/\{"_rowid":.*?\}/)
これだと少し妙なことになりかねません。
たとえば、一昨日と同じ条件のもと、取得件数を3件に減らした場合、変数resには次のような値(String)が入ってきます。
{ "dqnid":"31445463-c7f9-4bc4-b65b-71f46af37d79", "type":"hits", "values":[ {"_rowid":0,"cmsid":"sm24545601","title":"【Minecraft】ゲリラクラフト 周囲に防衛線を築き地雷を張り巡らせるんだ#5","view_counter":991492}, {"_rowid":1,"cmsid":"sm24184790","title":"【Minecraft】ゲリラクラフト 周囲に防衛線を築き地雷を張り巡らせるんだ#3","view_counter":892085}, {"_rowid":2,"cmsid":"sm23870501","title":"【Minecraft】ゲリラクラフト 周囲に防衛線を築き地雷を張り巡らせるんだ#1","view_counter":890153}] } { "dqnid":"31445463-c7f9-4bc4-b65b-71f46af37d79", "type":"stats", "values":[{"_rowid":0,"service":"video","total":9175}] } { "dqnid":"31445463-c7f9-4bc4-b65b-71f46af37d79", "endofstream":true, "type":"hits" } { "dqnid":"31445463-c7f9-4bc4-b65b-71f46af37d79", "endofstream":true, "type":"stats" }
もうお分かりのことと思います。
puts res.scan(/\{"_rowid":.*?\}/)
で出力をいじると
{"_rowid":0,"cmsid":"sm24545601","title":"【Minecraft】ゲリラクラフト 周囲に防衛線を築き地雷を張り巡らせるんだ#5","view_counter":991492}, {"_rowid":1,"cmsid":"sm24184790","title":"【Minecraft】ゲリラクラフト 周囲に防衛線を築き地雷を張り巡らせるんだ#3","view_counter":892085}, {"_rowid":2,"cmsid":"sm23870501","title":"【Minecraft】ゲリラクラフト 周囲に防衛線を築き地雷を張り巡らせるんだ#1","view_counter":890153} {"_rowid":0,"service":"video","total":9175}
となり、一番下の余計なものが入ってきてしまうのです。
これを解決するには
puts res.scan(/\{"_rowid":.*?\}/)
これを次のようにすれば大丈夫です。
puts res.scan(/\{"_rowid":.*?"cmsid".*?\}/)
なお、タイトル名だけをとりたい場合は一昨日のまま、つまり、
res.scan(/"title":".*?"/).each{|str| puts str.match(/("title":)(".*?")/)[2]}
で大丈夫です。そのはず。
「もっと簡単に書ける?」そうだと思います。
ただ正規表現は苦手で……これで勘弁してください。
以上、ささいなことといえばその通りなのですが、補足となります。
参考にした人がいらっしゃいましたら、すみませんでした。