こんにちは。
Rubyで正規表現で見つかった箇所の文字列を置換するプログラムを書いているのですが、
一部うまく作動せず、その原因が分からないため質問させていただきました。
以下プログラムの置換の部分になります。
49 case text
50 when /株式数(株)\t貸借対照表計上額(千円)|株式数(株)\t貸借対照表計上額(千円)/
51 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)\t/) {|s| "#{$1}株\t#{$3},000円\t"}
52 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
53 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t(\d{1})/){|s| "#{$1}株\t#{$3}円\t"}
54 when/百万円/
55 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)/) {|s| "#{$1}株\t#{$3},000,000円\t"}
56 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
57 when /株式数(株)\t貸借対照表計上額(百万円)/
58 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)/) {|s| "#{$1}株\t#{$3},000,000円\t"}
59 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
60 when /株式数(株)\t貸借対照表計上額(百万円)/
61 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)\t/) {|s| "#{$1}株\t#{$3},000,000円\t"}
62 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
63 when /株式数(1000株)\t貸借対照表計上額(百万円)/
64 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)\t/) {|s| "#{$1},000株\t#{$3},000,000円\t"}
65 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
66 when /株式数(1000株)\t貸借対照表計上額(百万円)/
67 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)\t/) {|s| "#{$1},000株\t#{$3},000,000円\t"}
68 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
69 when/株式数(1000株)\t貸借対照表計上額(百万円)/
70 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)\t/) {|s| "#{$1},000株\t#{$3},000,000円\t"}
71 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
72 when/株式数(1000株)\t貸借対照表計上額(百万円)/
73 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)\t/) {|s| "#{$1},000株\t#{$3},000,000円\t"}
74 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
75 when/株式数(株) 貸借対照表計上額(百万円)/
76 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)\t/) {|s| "#{$1},株\t#{$3},000,000円\t"}
77 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
78 when/株式数(株) 貸借対照表計上額(百万円)/
79 text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)\t/) {|s| "#{$1},株\t#{$3},000,000円\t"}
80 text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
81 end
以下は今のプログラムで出てくる結果です。
1つ目の数字の後ろに「株」、2つ目の数字の後ろに「,000円」がついています。
ハ保有目的が純投資目的である投資株式の前事業年度及び当事業年度における貸借対照表計上額の合計額並びに当事業年度における受取配当金、売却損益及び評価損益の合計額(a)保有目的が純投資目的以外の目的である投資株式銘柄数58銘柄貸借対照表計上額の合計額6,915百万円(b)保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額および保有目的(前事業年度)特定投資株式
前事業年度銘 柄株式数(株)貸借対照表計上額(百万円)保有目的
(株)髙島屋1,594,657株1,527,000円事業上の関係の維持・強化
トヨタ自動車(株)220,804株1,327,000円事業上の関係の維持・強化
(株)みずほフィナンシャルグループ3,295,570株642,000円取引銀行との関係の維持・強化
ヒューリック(株)638,400株552,000円事業上の関係の維持・強化
住友商事(株)229,198株294,000円事業上の関係の維持・強化
(株)三菱UFJフィナンシャル・グループ457,750株272,000円取引銀行との関係の維持・強化
阪急阪神ホールディングス(株)316,400株170,000円事業上の関係の維持・強化
(株)クラレ86,250株125,000円事業上の関係の維持・強化
積水ハウス(株)90,950株120,000円事業上の関係の維持・強化
東海旅客鉄道(株)10,000株112,000円事業上の関係の維持・強化
(株)池田泉州ホールディングス206,963株102,000円取引銀行との関係の維持・強化
帝人(株)425,000株99,000円事業上の関係の維持・強化
東レ(株)140,000株98,000円事業上の関係の維持・強化
(株)滋賀銀行181,020株96,000円取引銀行との関係の維持・強化
ダイニック(株)459,000株81,000円事業上の関係の維持・強化
三井住友トラスト・ホールディングス(株)187,568株80,000円取引銀行との関係の維持・強化
東日本旅客鉄道(株)10,000株75,000円事業上の関係の維持・強化
近畿日本鉄道(株)155,455株65,000円事業上の関係の維持・強化
長瀬産業(株)47,124株62,000円事業上の関係の維持・強化
ユニチカ(株)1,013,200株58,000円事業上の関係の維持・強化
(株)南都銀行154,532株58,000円取引銀行との関係の維持・強化
本田技研工業(株)12,245株46,000円事業上の関係の維持・強化
西日本旅客鉄道(株)10,000株42,000円事業上の関係の維持・強化
イオン(株)32,149株38,000円事業上の関係の維持・強化
コニカミノルタホールディングス(株)51,000株37,000円事業上の関係の維持・強化
本来ならば「,000円」ではなく「,000,000円」を付加して出力するはずなのですが
うまく動作せず「,000円」が付加されてしまっています。
どこを直せば正しく動作するでしょうか?
ご教授の程よろしくお願いします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
でも書いたのですが「理由をはっきりさせましょう」
プログラムを書く技術も必要ですが、それ以上に「正しく動作するかを確認する」「期待通りでない場合、その原因を調査解析し修正する」技術が大事です。
今回の例だと
・期待している when ではないwhen節が実行されている。または、どの条件にも当て嵌まらない。
・gsub!による置換が期待通りではない。
が主要因になりそうだ、と予想します。
そうなったら、デバッガや途中経過表示を使って
・textの内容と、実行されるwhenとが期待通りかを確認する
・gsub前と後のtextを比較して、期待通りの置換になっているかを確認する
もし、whenの不一致が理由なら、期待したwhenに合致するようにプログラムを変更します。
もし、gsubの置換が理由なら、期待した置換になるようにプログラムを変更します。
例えば
when /株式数(株)\t貸借対照表計上額(千円)|株式数(株)\t貸借対照表計上額(千円)/
STDERR.printf("when:%d:text:%s:\n",1,text)
text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t([1-9]\d{0,2}(,\d{3})*)\t/) {|s| "#{$1}株\t#{$3},000円\t"}
STDERR.printf("gsub後:%s:\n",text)
text.gsub!(/([1-9]\d{0,3})\t(\d{1})/){|s| "#{$1}株\t#{$2}円\t"}
STDERR.printf("gsub後:%s:\n",text)
text.gsub!(/([1-9]\d{0,2}(,\d{3})*)\t(\d{1})/){|s| "#{$1}株\t#{$3}円\t"}
STDERR.printf("gsub後:%s:\n",text)
とすれば、 このwhenにマッチしたときの処理の様子がわかります。
とりあえず気付いたのは
○whenは上から順番の評価され、最初にマッチしたものが使われます。
when/百万円/
が先に書いてあると、「百万円」を含むものは全てこちらになるため、 when /株式数(株)\t貸借対照表計上額(百万円)/ 等は絶対にマッチしません。
○もしかして、textはファイル全体ですか?
株式数(株)\t貸借対照表計上額(千円)
データ1
株式数(株)\t貸借対照表計上額(百万円
データ2
が全部一つになっているものだったら、 データ2の部分も「千円」として全部処理されます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
電子書籍作成、epubファイルの...
-
英数字を含む文字列(0-9,A-Z)...
-
C言語の入力した文字を反転させ...
-
1、Rstudioで回帰直線を求める...
-
区切り文字の調整方法について...
-
(再質問)エクセルのマクロボ...
-
ビーリアルのユーザー名を変え...
-
pandasでsqlite3にテーブル作成...
-
A4 持ち込み
-
パソコンのスクリーンセーバー...
-
Accessで文字列のバイト数読み込み
-
情報の表現。()内がどうしても...
-
Beautiful Soupのインストール...
-
VBScriptでExcel(2019)上のデー...
-
WSLのUbuntuで、Railsのインス...
-
前回の質問の続き
-
あせんうぶり言語
-
これらは書誌情報だと思うので...
-
pythonのerrorコード
-
三項でたとえば交換って
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ruby 正規表現で特定の文字を取...
-
Ruby 正規表現と置換
-
Rubyにおける、XPathの関数「te...
-
Rubyの正規表現、文字の追加
-
Ruby 改行文字の挿入
-
バッチ処理 特定の文字以降を...
-
VBAでcsvファイルもシートもあ...
-
Excelマクロ 空白セルを無視し...
-
ダブルコーテーション付きでCSV...
-
【ExcelVBA】300万件越えCSVか...
-
ファイル名を変数で書きこむfwr...
-
VBA テキストボックスを選択状...
-
[コンパイルエラー 修飾子が不...
-
fortranでNAのあるデータを読み...
-
SQLファイルの読み込み
-
複数のファイルをまたぐエクセ...
-
teratermで、ファイル名をinput...
-
VB.netでShellExecuteがしたい
-
VBAで複数のCSVからレコードセ...
-
Fortran:列数の分からないデー...
おすすめ情報