Rubyで文字列処理
今までテキストファイルの処理はPerlでやっていたのですが、今後を見据えちょっとRubyを触ってみることにしました。
ちなみにPerlもたいしてできるわけではありません。
参考サイト
やりたいこと
- テキストファイルの読み込み
- 1行飛ばしでの読み込み
- 半角スペースでの文字列の分割
- 必要な部分のみを取り出して新たなテキストファイルへ書き込み
ファイルの読み込み
RubyにはどうやらFileクラスというのがあってそれを使うと便利らしい。
#text.txtを読み込んでfileとして格納 File.open('text.txt') do |file| #fileを標準出力として出力 puts file end
今回は全行を1度に読み込むより1行毎に読み込んで使用したいのでforeach
メソッドを使用します。
#text.txtを1行ごとに読み込んでそれぞれをlineとして格納 File.foreach('text.txt') do |line| #lineを標準出力として出力 puts line end
1行飛ばしでの読み込み
私が今回扱いたかったファイルは2行が一つのデータ構造となっており必要なのは1行目の方のデータのみでしたのでそちらのデータのみを取り出して2行目は捨てる必要がありました。そしてデータ構造の頭には>
がついていましたのでRuby側で行頭に>
があれば処理を行い、なかったら何もしないという処理を行いたいと思います。
こういう時にはslice
メソッドを使用するのがよいみたいだ。
#text.txtを1行ごとに読み込んでそれぞれをlineとして格納 File.foreach('text.txt') do |line| #lineの行頭が>だったらlineを標準出力 if line.slice(0) == '>' then puts line end end
半角スペースでの分割
Perlでもおなじみのsplit
メソッドですね。
Rubyでは引数を設定しないと自動で半角スペースでの分割になるみたいです。(Perlではどうだったか忘れた)
ref.xaio.jp
#text.txtを1行ごとに読み込んでそれぞれをlineとして格納 File.foreach('text.txt') do |line| #lineの行頭が>だったらlineを標準出力 if line.slice(0) == '>' then #半角スペースで分割した文字列をそれぞれ配列として格納 array = line.split #文字列の1つめを標準出力 puts array[0] end end
新たなファイルへ出力
ここでもFileクラスを利用して書き込むのが良いみたいですが、いちいちアクセスしていては面倒なのでsplitして必要な部分を切り出したらそれを一つの文字列としてまとめる作業を行っておきます。
#text.txtを1行ごとに読み込んでそれぞれをlineとして格納 File.foreach('text.txt') do |line| #lineの行頭が>だったらlineを標準出力 if line.slice(0) == '>' then #半角スペースで分割した文字列をそれぞれ配列として格納 array = line.split #必要な部分を切り出してoutputに代入 output << array[0] << ' ' << array[1] << "\n" end end File.open('output.txt','w') do |out| out.puts output end
やりました。
最後に
とりあえずこんな感じで書いてみましたが割と間違っているし、もっと効率よくかける部分がたくさんある気がしますのでプロい方は教えていただけると私が喜びます。