• 締切済み

数値の抽出方法がわからず困っています

テキストデータの処理がうまくいかず困っています。 ----------------------------------------------- a:0.001 b:-11.111 c:50.5 d:-12.345 ----------------------------------------------- といった文字列から ----------------------------------------------- 0.001 -11.111 50.5 -12.345 ----------------------------------------------- といった形で符号や小数点を含めて抽出したいのですが どのようにするのが良いのでしょうか。 各値は、それぞれの値がスペースによって区切られています。 また、各値は数値の大きさがそれぞれ異なり桁数が一定ではありません。 split や substr を用いてやろうとしているのですが、 なかなか思ったとおりの形で出力できません…

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

リストコンテキストで、gフラグをつけてマッチを実行すれば数値の部分だけ取り出すのは簡単にできます。 use strict; use warnings; use feature 'say'; use Regexp::Common; while (<DATA>) { chomp; my @numbers = /$RE{num}{real}/g; say join ' ', @numbers; } __END__ a:0.001 b:-11.111 c:50.5 d:-12.345 a:0.001 b:-11.112 c:50.5 d:-12.346 a:0.001 b:-11.113 c:50.5 d:-12.347 実行結果: 0.001 -11.111 50.5 -12.345 0.001 -11.112 50.5 -12.346 0.001 -11.113 50.5 -12.347 Regexp::Commonをインストールする必要がありますが、#2のTacosanさんが 示されているような正規表現を使えばRegexp::Common抜きでも同様のことが可能です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

/([+-]?(?:(?:\d*\.)?\d+))/g; にマッチさせてみるとか. または tr/0-9+.-/ /cs; で不要な文字をつぶしてから split など.

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

split(/[\sA-Za-z:]+/,文字列);を使用します。 以下サンプル while(<DATA>){ @elm = split(/[\sA-Za-z:]+/,$_); print $elm[0],"\t",$elm[1],"\t",$elm[2],"\t",$elm[3],"\t",$elm[4],"\n"; } __DATA__ a:0.001 b:-11.111 c:50.5 d:-12.345 a:0.001 b:-11.112 c:50.5 d:-12.346 a:0.001 b:-11.113 c:50.5 d:-12.347 実行結果は 0.001 -11.111 50.5 -12.345 0.001 -11.112 50.5 -12.346 0.001 -11.113 50.5 -12.347 となります。 $elm[0]は数値が入りませんので、使用しないで下さい。 $elm[1]~$elm[4]に目的の数値がはいります。

関連するQ&A