rubyでxmlファイルをrexmlつかって解析しようとして諦めました

こんにちは。

こちら、雪がひどいです…
積雪量が60センチはあるんじゃないか、と思うくらいにはやばいです。

そんな中、今日も学校に行こうと思いましたが、 あいにくと、今日と明日はセンター試験のため、学内には入れないそうなので、家で作業してます。 その一つの内容が、今日これから書く話です。

xmlって何

xmlは、XML(eXtensible Markup Language)のことで、構造化言語の一つです。 特徴として、データに対してタグを設定してやることで、それがなんのデータなのかを自由に決めることができます。

Rubyによる解析(ぶち当たった壁1)

研究でデータを抽出するためにRubyで解析しようとしてたんですが、まずファイル容量が大きすぎて、解析にすごく時間がかかるという問題にぶち当たりました。
しかし、bashで10000行ごとにファイル分割を行う、という方法で、なんとかなりました。

さらにぶち当たった壁2

戦えるぞ!と思った矢先にぶつかった壁が、使おうとしてたデータが、<row />と言う形で一行で一つのデータになっているため、タグでデータが挟まれていないという問題です。
そのため、rexml/documentを使おうと思っていた僕は、積みました。

# エラー内容
Illegal character '<' in raw string "<p>I ...略

こんな感じで、Illegal characterだよっていうエラーです。タグの中に文字列の<が入ってるせいで発生した問題のようです。
なので、諦めました。

そうだ、ライブラリに頼るのはやめよう

そこで、もうこの際テキスト処理にしてしまおう、という方向で頑張ることにしました。
できました。

File.open('ruby.xml').each_with_index do |line, i|
  line =~ /<code>(.+)<\/code>/
  matched_line = $+

  if (!(matched_line.nil?) && matched_line.length > 0)
    print "#{i+1}: "
    p '<code>' + matched_line + '</code>'
    puts '======='
  end
end

今回<code></code>の間の文字列が欲しかったので、その区間の文字列を全部取ってくるっていう処理です。each_with_indexを使ってるのは、後からxmlファイルを見たときに何行目の処理だったかなぁ?の確認をするためです。

あとは、ここからクローンディテクションツールで、コードクローンを検出して…などなど。
意外とまだやることは山積みだなぁ。

独り言

そういえば、研究室にgitlabを入れるって言う話が今度上がるかもなぁ。 導入できたら、研究のデータのバージョン管理が一括管理されてすごく便利なんだけど、いかんせん保守する人がいなくなる可能性を考えると、導入しても大変なんじゃないかなぁっていう不安があります。

いい考えだと思うんだけどなぁ。研究室内サーバに立てたら、学内しか繋がらないから、学校くる動機にもなるし、一石二鳥てきな(?)


お疲れ様でした。