こんばんは。
最近Rubyでファイルのスクローリングをしているのですが、
以下のようなスクリプトを全てのファイルに適用したいと考えています。

1 fpath = '/home/edinet/E30479/S1002D1W/index.html'
2
3 text = ""
4
5
6 File.open(fpath).each do |f|
7 f.each_line do |line|
8
9 line.gsub!(/前事業年度特定投資株式/,"前事業年度")
10 line.gsub!(/当事業年度特定投資株式/,"当事業年度")
11
12 end
13 end
14
15
16 flag = nil
17 IO.foreach(fpath) do |line2|
18
19 case line2
20 when /保有目的が純投資目的以外/
21 flag = true
22 when /保有目的が純投資目的/
23 flag = false
24 end
25
26 text << line2.chomp if flag == true
27 end


Dir.globなどを使えば良いと思うのですが、具体的にはどのように記述すればよいのでしょうか?
ご教授の程お願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

あと、このプログラム、なんか変ですよ?



File.open(fpath).each

ここのeachって変ですよね。

f.each_line do |line|
line.gsub!(/前事業年度特定投資株式/,"前事業年度")

ここでの 変数lineに入っているのは、「ファイルから読み込んだ文字列」です。
ファイルの内容をメモリ上にコピーしたものです。
これを変更しても、元のファイルは変更されません。

また、一行読み込む度に次の行の内容になるので、gsubした結果はどこにも残りません。
    • good
    • 0

> Dir.globなどを使えば良いと思うのですが



そう思ったら、マニュアルとかで調べてみましょう。
http://docs.ruby-lang.org/ja/2.1.0/class/Dir.htm …

ディレクトリを再帰的に走査するUnixのコマンドがあります。
「 find 」と言います。
このことを知っていれば、Rubyにも同じようなものは無いか、探してみようと思うはずです。
http://docs.ruby-lang.org/ja/2.1.0/library/find. …

これらを使って見つけたファイル`パスをfpathに代入して、実行するようにします。
このスクリプト全体をループの中に入れてもいいですが、このスクリプトを関数として定義して、fpathは引数として与えるようにするのがよいでしょう。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QRuby flagによるファイルの特定行の抽出

1
2 text = ""
3 data = "/home/edinet/E30682/S1002C62/index.html"
4
5
6 flag = nil
7 IO.foreach(data) do |line2|
8
9 case line2
10 when /保有目的が純投資目的以外の目的である投資株式の保有区分/
11 flag = true
12
13 when /保有目的が純投資目的である投資株式|監査報酬の内容等/
14 flag = false
15
16 end
17
18 text << line2.chomp if flag == true
19 break if flag == false
20
21 end
22 text.gsub!(/<\/td>/,"\t")
23 text.gsub!(/<\/tr>/,"\n")
24 text.gsub!(/<[^>]+>/,"")
25 print text
26
27
28


やりたいことは

「保有目的が純投資目的以外の目的である投資株式の保有区分」が含まれる行から
「保有目的が純投資目的である投資株式」「監査報酬の内容等」が含まれる行までを取得し、
textにそれらを入れ込む
「保有目的が純投資目的である投資株式」「監査報酬の内容等」が含まれる行まで行くと繰り返しが終了する

です。

しかし、これを実行しても何も表示されないため解決方法について質問させていただきました。
なお、break if flag == false の部分をコメントアウトすると指定していない部分まで取得し、printしてしまいます。
どこを直せば正しく取得できるでしょうか?

どうかご教授の程よろしくお願いいたします。

1
2 text = ""
3 data = "/home/edinet/E30682/S1002C62/index.html"
4
5
6 flag = nil
7 IO.foreach(data) do |line2|
8
9 case line2
10 when /保有目的が純投資目的以外の目的である投資株式の保有区分/
11 flag = true
12
13 when /保有目的が純投資目的である投資株式|監査報酬の内容等/
14 flag = false
15
16 ...続きを読む

Aベストアンサー

#3です。
提示されたhtmlで試験しましたが、正常に動作します。
(提示されたhtmlの後ろに適当なデータを付加しました)

以下実行結果です。
------------------------
ロ 保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目的前事業年度特定投資株式銘柄 株式数(株) 貸借対照表計上額(千円) 保有目的
日産自動車株式会社仕入先との取引関係強化のため
 (2)【監査報酬の内容等】
-------------------------

考えられるのは、
【監査報酬の内容等】の行の次に、余分な行があるのではなく、
【監査報酬の内容等】と同じ行に余分なデータがあるということです。
そのことを確認するために、以下のスクリプトを実行してください。
----------------------------------
text = ""
data = "/home/edinet/E30682/S1002C62/index.html"

flag = nil
no = 0
IO.foreach(data) do |line2|
no += 1
case line2
when /保有目的が純投資目的以外の目的である投資株式の保有区分/
flag = true

when /保有目的が純投資目的である投資株式|監査報酬の内容等/
flag = false

end

text << line2.chomp if flag != nil
printf("取得行=%d\n",no) if flag != nil
printf("取得終了行=%d\n",no) if flag == false
break if flag == false

end
text.gsub!(/<\/td>/,"\t")
text.gsub!(/<\/tr>/,"\n")
text.gsub!(/<[^>]+>/,"")
print text

----------------------------------
結果は、
取得行=...
取得行=...
取得行=...
取得終了行=・・・

のように表示されるはずです。

もし、このようになって、余分なデータがあるなら、
それは、「監査報酬の内容等」と同じ行に余分なデータがあることになります。
そし、そうならない場合は、正規表現のマッチが正しくない(考えにくいですが・・)
ことになります。

こちらの実行環境は以下の通りです。
windows7
ruby 1.9.3p374 (2013-01-15) [i386-mingw32]
文字コード:WINDOWS-31J(スクリプトの文字コード、index.htmlの文字コード)
スクリプトの先頭に
# coding:WINDOWS-31J
を記述しています。

次回、補足される場合は、念の為
実行環境、及び文字コードも含めてご提示ください。
文字コードは、スクリプトを記述している文字コード、データの文字コード、
スクリプトで指定しているcodingの文字コードを提示ください。

#3です。
提示されたhtmlで試験しましたが、正常に動作します。
(提示されたhtmlの後ろに適当なデータを付加しました)

以下実行結果です。
------------------------
ロ 保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目的前事業年度特定投資株式銘柄 株式数(株) 貸借対照表計上額(千円) 保有目的
日産自動車株式会社仕入先との取引関係強化のため
 (2)【監査報酬の内容等】
-------------------------

考えられるのは、
【監査報酬...続きを読む

QRuby flagによるファイルの特定行の抽出

こんばんは。

Rubyでファイルの特定行を抽出するプログラムを作っているのですが、
flagを立てて特定の場所から特定の場所までを指定する方法をとりたいと思っています。

ある程度までは書いたのですが、そこからどうすれば良いのかが分かりません。

なにとぞ御教授、御添削の程お願い致します。

data = File.open(fpath) do |f|
6
7 f.each_line do |line|
8
9 line.gsub!(/前事業年度特定投資株式/,"前事業年度")
10 line.gsub!(/当事業年度特定投資株式/,"当事業年度")
11
12
13 line.gsub!(/保有目的が純投資目的である/,"EOF")
14 line.gsub!(/保有目的が純投資目的の/,"EOF")
15
16 # next unless line =~ /保有目的が純投資目的以外/ .. line =~ /EOF/
17
18
19 if $flag == 1
20 text << line.chomp unless line =~ /^\s+$/
21
22 if line =~ /保有/
23 $flag = 1
24 else if line =~ /EOF/
25 $flag = 0

こんばんは。

Rubyでファイルの特定行を抽出するプログラムを作っているのですが、
flagを立てて特定の場所から特定の場所までを指定する方法をとりたいと思っています。

ある程度までは書いたのですが、そこからどうすれば良いのかが分かりません。

なにとぞ御教授、御添削の程お願い致します。

data = File.open(fpath) do |f|
6
7 f.each_line do |line|
8
9 line.gsub!(/前事業年度特定投資株式/,"前事業年度")
10 line.gsub!(/当事業年度特定投資株...続きを読む

Aベストアンサー

プログラムが断片的でよくわかりません。

「保有」という文字が含まれる行から、「EOF」という文字が含まれる行の前の行まで を取り出すとすると、

text = ""
flag = nil
IO.foreach(fpath) do |line|

case line
when /保有/
flag = true
when /EOF/
flag = false
end

text << line if flag
end

puts text

QArray#eachのブロック中で要素追加

初歩的な質問で申し訳ありません

ary = [Foo.new]
ary.each do |i|
 if (条件)
  ary.push(Foo.new)
 end
end

上の様にブロックの中である条件でaryに要素が追加されます。
この場合、この追加された要素はeachで漏れなく扱えるのでしょうか?
簡単なプログラムで試した限りではpushされたFooインスタンスについてもeachで取り出せているようなのですが、自信が無いので質問致します。

# coding: windows-31J

class Foo
attr_accessor :checked
attr_reader :val
RAND_MAX = 5

def initialize
rnd = Random.new
@checked = false
@val = rnd.rand(RAND_MAX).to_i
end
end

ary = [Foo.new]

ary.each do |f|
if f.val > 0
ary.push(Foo.new)
end
f.checked = true
end

cnt_true = 0
cnt_false = 0
ary.each_index do |idx|
print "#{idx} #{ary[idx].checked} #{ary[idx].val}\n"
if ary[idx].checked
cnt_true += 1
else
cnt_false += 1
end
end
puts "checked true = #{cnt_true}"
puts "checked false = #{cnt_false}"



よろしくお願いします。

初歩的な質問で申し訳ありません

ary = [Foo.new]
ary.each do |i|
 if (条件)
  ary.push(Foo.new)
 end
end

上の様にブロックの中である条件でaryに要素が追加されます。
この場合、この追加された要素はeachで漏れなく扱えるのでしょうか?
簡単なプログラムで試した限りではpushされたFooインスタンスについてもeachで取り出せているようなのですが、自信が無いので質問致します。

# coding: windows-31J

class Foo
attr_accessor :checked
attr_reader :val
RAND_MAX = 5

def initialize...続きを読む

Aベストアンサー

Array#eachではイテレート毎に要素数のチェックをしてるので、後ろに足していく
pushなら問題ないみたいです。イテレート中のpopも大丈夫です。
でも、Arrayの先頭を操作する、shiftやunshiftでは内部ループカウンタとインデックスが
ずれるのでダメですね。
一応CRubyの実装をコピペしときます。

array.c:
VALUE
rb_ary_each(VALUE ary)
{
  long i;

  RETURN_ENUMERATOR(ary, 0, 0);
  for (i=0; i<RARRAY_LEN(ary); i++) { // ←イテレート毎に長さのチェック
    rb_yield(RARRAY_PTR(ary)[i]);
  }
  return ary;
}

Qrubyでnums.each_char()の意味を探したい

rubyでnums.each_char()の意味を探したい

参考書で、nums.each_char()の意味を探したいのですが、どうすればいいのでしょうか?普通にリファレンスを見ると、each_char()の別のクラスでの説明は見つかるのですが、numsクラスの説明がありませんでした。このような時、どうすれば解決できますでしょうか?このメソッドの意味と探す方法を教えてください。

当方初心者なので、簡単な言葉で説明してくださると助かります。
よろしくおねがいします。

Aベストアンサー

numsってクラスは組込みにないと思います。
というより、小文字で始まるクラスは無いんですが。

ただの変数じゃないんですか?
each_char()が使えるということは文字列か、文字列と互換のあるクラスだと思われます。

Qruby の while ~end の適応区間について

rubyで

while

end

と関数を組みますが

(1)while
(2)while
(2)end
(1)end
とした場合
(1)の間に(2)を組むような方法はあるのでしょうか?
その書き方を知りたいです。
(1)で開始され(2)で終わるのではなく、(1)で開始され(1)で終わるように
命令したいです。

Aベストアンサー

Rubyのwhile式は当然ネスト可能です。


while condition
while another_condition
something
end
end

と書けば、別に最初に出現したendで外側のwhileまで終わったりはしません。


人気Q&Aランキング

おすすめ情報