nekoTheShadow’s diary

IT業界の片隅でひっそり生きるシステムエンジニアです(´・ω・`)

一昨日の記事に対する修正。


一昨日書いた記事に次のようなコードを乗せました。

実はこれにはある種の欠陥がありました。

上記コードにおいて、出力を整える部分で次のように書いたのですが……

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]}

で大丈夫です。そのはず。

「もっと簡単に書ける?」そうだと思います。
ただ正規表現は苦手で……これで勘弁してください。

以上、ささいなことといえばその通りなのですが、補足となります。
参考にした人がいらっしゃいましたら、すみませんでした。