• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Ruby flagによるファイルの特定行の抽出)

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

このQ&Aのポイント
  • 保有目的が純投資目的以外の目的である投資株式の保有区分が含まれる行から、保有目的が純投資目的である投資株式や監査報酬の内容等が含まれる行までを取得する方法を教えてください。
  • 上記のコードを実行しても何も表示されない場合、どのように修正すれば良いですか?
  • また、コメントアウトした部分を指定していない部分まで取得し、printする場合、どのように修正すれば良いですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

#3です。 提示されたhtmlで試験しましたが、正常に動作します。 (提示されたhtmlの後ろに適当なデータを付加しました) 以下実行結果です。 ------------------------ ロ 保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目的前事業年度特定投資株式銘柄 株式数(株) 貸借対照表計上額(千円) 保有目的 日産自動車株式会社仕入先との取引関係強化のため  (2)&nbsp;【監査報酬の内容等】 ------------------------- 考えられるのは、 【監査報酬の内容等】の行の次に、余分な行があるのではなく、 【監査報酬の内容等】と同じ行に余分なデータがあるということです。 そのことを確認するために、以下のスクリプトを実行してください。 ---------------------------------- 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)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

#2です。 >18行目を書き換えてみましたが、まだ不要な部分まで取得してしまいます。 とのことですが、こちらでは、正しく動作しています。 不要な部分とは、どの部分ですか? 1.「保有目的が純投資目的以外の目的である投資株式の保有区分」の以前の行 2.「保有目的が純投資目的である投資株式」又は「監査報酬の内容等」の後の行 のどちらでしょうか? もし、可能であれば、index.htmlの内容も提示されると、問題が解決できるかも知れません。 (機密情報を含む場合は、提示しないで下さい)

alpacasan15
質問者

補足

2.「保有目的が純投資目的である投資株式」又は「監査報酬の内容等」の後の行です。 長くなってしまうので該当箇所の付近のみ掲載します。 ロ 保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目的</p><p class="tde_text4"> 前事業年度</p><p class="tde_text5" style="font-size: 10pt; padding-left: 40pt; padding-right: 0pt; margin-top: 0pt; margin-bottom: 0pt; text-indent: 9.95pt; font-family: 'MS 明朝'; line-height: 18pt; text-align: justify; letter-spacing: 0pt;"> 特定投資株式</p><table rules="none" frame="void" summary="table" style="border-collapse: collapse; border: 0pt solid rgb(0, 0, 0);" cellpadding="0" cellspacing="0"> <tbody><tr style="height: 22.5pt;"><td style="width: 135pt; border-width: 0.5pt; border-style: solid; border-color: -moz-use-text-color;" valign="middle"> <div class="tde_tblC" style="width: 100%;" lang="ja"> 銘柄</div> </td> <td style="width: 93.8pt; border-width: 0.5pt; border-style: solid; border-color: -moz-use-text-color;" valign="middle"> <div class="tde_tblC" style="width: 100%;" lang="ja"> 株式数<br>(株)</div> </td> <td style="width: 93.8pt; border-width: 0.5pt; border-style: solid; border-color: -moz-use-text-color;" valign="middle"> <div class="tde_tblC" style="width: 100%;" lang="ja"> 貸借対照表計上額<br>(千円)</div> </td> <td style="width: 150pt; border-width: 0.5pt; border-style: solid; border-color: -moz-use-text-color;" valign="middle"> <div class="tde_tblC" style="width: 100%;" lang="ja"> 保有目的</div> </td> </tr> <tr style="height: 22.5pt;"><td style="width: 135pt; border-width: 0.5pt; border-style: solid; border-color: -moz-use-text-color;" valign="middle"> <div class="tde_tblC" style="width: 100%; font-size: 9pt; padding-left: 0pt; padding-right: 0pt; margin-top: 0pt; margin-bottom: 0pt; text-indent: 4.95pt; font-family: 'MS 明朝'; letter-spacing: 0pt; line-height: 10pt; text-align: left;" lang="ja"> 日産自動車株式会社</div> ここから始まり、 <td style="width: 150pt; border-width: 0.5pt; border-style: solid; border-color: -moz-use-text-color;" valign="middle"> <div class="tde_tblR" style="font-size: 9pt; padding-left: 0pt; padding-right: 4.55pt; margin-top: 0pt; margin-bottom: 0pt; text-indent: 4.95pt; font-family: 'MS 明朝'; letter-spacing: 0pt; line-height: 10pt; text-align: left;" lang="ja"> 仕入先との取引関係強化のため</div> </td> </tr> </tbody></table><br style="line-height: 0.75pt;" clear="all"> <p class="tde_text6" style="line-height: 10pt; font-size: 9pt;">  </p><h4 class="tde_head3"> <a name="E0046" id="E0046"></a>(2)&nbsp;【監査報酬の内容等】</h4><h5 class="tde_head4"> <a name="E0047" id="E0047"></a>(1)&nbsp;【監査公認会計士等に対する報酬の内容】</h5><table rules="none" frame="void" summary="table" style="border-collapse: collapse; border: 0pt solid rgb(0, 0, 0);" cellpadding="0" cellspacing="0"> <tbody><tr style="height: 22.5pt;"><td rowspan="2" style="width: 93.8pt; border-width: 0.5pt; border-style: solid; border-color: -moz-use-text-color;" valign="middle"> <div class="tde_tblC" style="width: 100%;" lang="ja"> 区分</div> </td> この辺りで終わるはずなのですが、これ以降の行も取得し続けています。 以下Ruby実行結果です。 ロ 保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目的前事業年度特定投資株式銘柄 株式数(株) 貸借対照表計上額(千円) 保有目的 日産自動車株式会社 43,059 32,208 仕入先との取引関係強化のため トピー工業株式会社 111,270 25,147 仕入先との取引関係強化のため ユニプレス株式会社 2,600 5,363 仕入先との取引関係強化のため 日本プラスト株式会社 300 172 仕入先との取引関係強化のため   当事業年度特定投資株式銘柄 株式数(株) 貸借対照表計上額(千円) 保有目的 日産自動車株式会社 45,687 45,916 仕入先との取引関係強化のため トピー工業株式会社 119,369 23,277 仕入先との取引関係強化のため ユニプレス株式会社 2,600 4,622 仕入先との取引関係強化のため 日本プラスト株式会社 300 155 仕入先との取引関係強化のため  (2)&nbsp;【監査報酬の内容等】(1)&nbsp;【監査公認会計士等に対する報酬の内容】区分 前連結会計年度 当連結会計年度 監査証明業務に基づく報酬(千円) 非監査業務に基づく報酬(千円) 監査証明業務に基づく報酬(千円) 非監査業務に基づく報酬(千円) 提出会社 9,000 ― 13,278 500 連結子会社 ― ― ― ― 計 9,000  ― 13,278 500 ※この実行結果は 22 text.gsub!(/<\/td>/,"\t") 23 text.gsub!(/<\/tr>/,"\n") 24 text.gsub!(/<[^>]+>/,"") このメソッドを追加してからprint textしたものになります。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

18行 を以下のように変えてください。 text << line2.chomp if flag != nil

alpacasan15
質問者

補足

ご回答ありがとうございます。 18行目を書き換えてみましたが、まだ不要な部分まで取得してしまいます。 正規表現の仕方が悪いのでしょうか。

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

入力データのサンプルがないので憶測でしか言えませんが、 「保有目的が純投資目的以外の目的である投資株式の保有区分」が初めて出現する行よりも前に 「保有目的が純投資目的である投資株式」または「監査報酬の内容等」が出現している…… ということはありませんか? もしそうであるなら、 9 case line2 10 when /保有目的が純投資目的以外の目的である投資株式の保有区分/ 11 flag = true 12 13 when /保有目的が純投資目的である投資株式|監査報酬の内容等/ 14 flag = false if flag == true # flagがtrueのときだけfalseにする 15 16 end としてみてはいかがでしょう。

alpacasan15
質問者

補足

ありがとうございます。取得することができました。 しかし、falseによるbreakがうまくいかず、trueとfalseで範囲指定した場所以外の部分も全て取得してしまいます。 入力データの原文中に指定した文字は存在するため文字の間違いという事は無いと思います。 これはどういった原因なのでしょうか。

関連するQ&A