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を入れるって言う話が今度上がるかもなぁ。 導入できたら、研究のデータのバージョン管理が一括管理されてすごく便利なんだけど、いかんせん保守する人がいなくなる可能性を考えると、導入しても大変なんじゃないかなぁっていう不安があります。
いい考えだと思うんだけどなぁ。研究室内サーバに立てたら、学内しか繋がらないから、学校くる動機にもなるし、一石二鳥てきな(?)
お疲れ様でした。