「OUTPUTからの情報抽出」の編集履歴(バックアップ)一覧はこちら

OUTPUTからの情報抽出」(2005/08/15 (月) 15:02:29) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*OUTPUT ファイルからの情報抽出 -Web 上で実行 --[[記事>http://blog.goo.ne.jp/hkasai/e/353d1311ff4a4d1350d9d8c574f7bc06]] --[[記事(追記)>http://blog.goo.ne.jp/hkasai/e/65ff65b3aec7d8a12995ec670553625f]] --実行場所 http://homepage1.nifty.com/hkasai/NMonal/NMonal.html *複数の OUTPUT ファイルから情報を抽出 -あるフォルダ内にある OUTPUT ファイルすべてから必要な情報を抽出する. --フォルダ内に OUTPUT ファイル以外のファイルが保存されていても構わない.OUTPUT ファイルのみを認識して,以下の作業が自動的に行われる. -使い方 --1. 下のプログラム (ReadNMoutMulti.pl および NMoutAnal.pl) をひとつのフォルダに保存する --2. Perl をインストールしておく.([[Perl]] 参照) --3. 以下のように実行する.結果は CSV ファイルに出力される.Summary.csv は使用者が任意につける名前.何でもよい. ### カレントフォルダの OUTPUT をすべて対象とする場合 ### C:\nmv\run>perl ReadNMoutMulti.pl . > Summary.csv ### カレントフォルダの下の OUT フォルダの中のファイルを対象とする場合 ### C:\nmv\run>perl ReadNMoutMulti.pl out > Summary.csv *注意 -COV ステップのエラー検出には未対応です.==> 対応しました. -結果の保証はいたしかねます. *ReadNMoutMulti.pl use strict; require 'NMoutAnal.pl'; my $ThisScriptName = "ReadNMoutMulti.pl"; if (@ARGV != 1) { print "Usage: perl $ThisScriptName FOLDER_name\n\n"; die; } my $dirname = shift @ARGV; my @result_all; opendir(DIR, $dirname) or die "$dirname: $!"; while (defined(my $fname = readdir(DIR))) { next if ($fname =~ /pl$/); next unless (-f "$dirname\\$fname"); open(FILE, "$dirname\\$fname") or die "$dirname\\$fname: $!"; my $isOutputFile = 0; while (defined(my $line = <FILE>)) { if ($line =~ "DEVELOPED AND PROGRAMMED BY STUART BEAL AND LEWIS SHEINER" ) { $isOutputFile = 1; } } close(FILE); if ($isOutputFile) { my %result1 = &NMoutAnal("$dirname\\$fname"); $result1{'FNAME'} = $fname; push(@result_all, \%result1); } } closedir(DIR); my $max_ntheta = 0; my $max_nomega = 0; my $max_nsigma = 0; foreach my $res1 (@result_all) { if ($res1->{'NTHETA'} > $max_ntheta) { $max_ntheta = ${$res1}{'NTHETA'}; } if ($res1->{'NOMEGA'} > $max_nomega) { $max_nomega = ${$res1}{'NOMEGA'}; } if ($res1->{'NSIGMA'} > $max_nsigma) { $max_nsigma = ${$res1}{'NSIGMA'}; } } print "Output,EST Status,COV Status,NIndiv,Nobs,OBJ"; for (1..$max_ntheta) { print ",TH$_"; } for (1..$max_nomega) { print ",OM$_"; } for (1..$max_nsigma) { print ",SG$_"; } for (1..$max_ntheta) { print ",SETH$_"; } for (1..$max_nomega) { print ",SEOM$_"; } for (1..$max_nsigma) { print ",SESG$_"; } print "\n"; my @values; my $COV_status; foreach my $res1 (@result_all) { $COV_status = "Success"; if ($res1->{'COV_STATUS'} == 0) { $COV_status = "Failure"; } elsif ($res1->{'COV_STATUS'} == -1) { $COV_status = "Not Implemented"; } print "$res1->{'FNAME'}"; print ",$res1->{'STATUS'}"; print ",$COV_status"; #COV status print ",$res1->{'NINDIV'}"; print ",$res1->{'NOBS'}"; print ",$res1->{'OBJ'}"; @values = &ConvEStrToNum($res1->{'THETA'}); print ",", join(",", @values); if ($res1->{'NTHETA'} < $max_ntheta) { foreach my $i (($res1->{'NTHETA'} + 1)..$max_ntheta) { print ",."; } } @values = &ConvEStrToNum($res1->{'OMEGA'}); print ",", join(",", @values); if ($res1->{'NOMEGA'} < $max_nomega) { foreach my $i (($res1->{'NOMEGA'} + 1)..$max_nomega) { print ",."; } } @values = &ConvEStrToNum($res1->{'SIGMA'}); print ",", join(",", @values); if ($res1->{'NSIGMA'} < $max_nsigma) { foreach my $i (($res1->{'NSIGMA'} + 1)..$max_nsigma) { print ",."; } } @values = &ConvEStrToNum($res1->{'SE_THETA'}); print ",", join(",", @values); if ($res1->{'NTHETA'} < $max_ntheta) { foreach my $i (($res1->{'NTHETA'} + 1)..$max_ntheta) { print ",."; } } @values = &ConvEStrToNum($res1->{'SE_OMEGA'}); print ",", join(",", @values); if ($res1->{'NOMEGA'} < $max_nomega) { foreach my $i (($res1->{'NOMEGA'} + 1)..$max_nomega) { print ",."; } } @values = &ConvEStrToNum($res1->{'SE_SIGMA'}); print ",", join(",", @values); if ($res1->{'NSIGMA'} < $max_nsigma) { foreach my $i (($res1->{'NSIGMA'} + 1)..$max_nsigma) { print ",."; } } print "\n"; } *NMoutAnal.pl use strict; sub NMoutAnal { if (@_ != 1) { print "Irregular arguments.\n\n"; die; } my $output_file = shift @_; if (not -e $output_file) { print "File not found: $output_file\n\n"; die; } open(OUTPUT, $output_file) or die "$!"; my @lines = <OUTPUT>; my $nlines = @lines; close(OUTPUT); my %result; my $problem; my $tmp; my $nobs; my $nindiv; my $del; my $status; my $obj; my @theta; my $ntheta; my $str; my @omega; my $nomega; my @sigma; my $nsigma; my @se_theta; my @se_omega; my @se_sigma; foreach my $i (0..($nlines - 1)) { if ($lines[$i] =~ /PROBLEM NO./) { $i++; chomp($lines[$i]); $problem = $lines[$i]; $problem =~ s/^ +//; $problem =~ s/ +$//; $result{'PROBLEM'} = $problem; } elsif ($lines[$i] =~ /OBS RECS/) { chomp($lines[$i]); ($tmp, $nobs) = split(/: +/, $lines[$i]); $result{'NOBS'} = $nobs; } elsif ($lines[$i] =~ /OF INDIVIDUALS/) { chomp($lines[$i]); ($tmp, $nindiv) = split(/: +/, $lines[$i]); $result{'NINDIV'} = $nindiv; } elsif ($lines[$i] =~ /MINIMIZATION/) { chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '0') { $del = 1; } $status = substr($lines[$i], $del); $result{'STATUS'} = $status; } elsif ($lines[$i] =~ /MINIMUM VALUE OF OBJ/) { do { $i++; } until ($lines[$i] =~ /[\-\d\.]+/); $obj = $&; $result{'OBJ'} = $obj; } elsif ($lines[$i] =~ /FINAL PARAMETER ESTIMATE/) { do { $i++; } until ($lines[$i] =~ /TH 1/); $i += 2; chomp($lines[$i]); @theta = split(' ', $lines[$i]); $ntheta = @theta; $result{'NTHETA'} = $ntheta; $result{'THETA'} = "@theta"; if ($lines[$i + 4] =~ /OMEGA/) { do { $i++; } until ($lines[$i] =~ /^ ?ETA1/); $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @omega = split(' ', $str); $i += 2; while ($lines[$i] =~ /^ ?ETA/) { $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @omega = (@omega, split(' ', $str)); $i += 2; }; $nomega = @omega; $result{'NOMEGA'} = $nomega; $result{'OMEGA'} = "@omega"; } if ($lines[$i + 2] =~ /SIGMA/) { do { $i++; } until ($lines[$i] =~ /^ ?EPS1/); $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @sigma = split(' ', $str); $i += 2; while ($lines[$i] =~ /^ ?EPS/) { $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @sigma = (@sigma, split(' ', $str)); $i += 2; }; $nsigma = @sigma; $result{'NSIGMA'} = $nsigma; $result{'SIGMA'} = "@sigma"; } } elsif ($lines[$i] =~ /STANDARD ERROR/) { do { $i++; } until ($lines[$i] =~ /TH 1/); $i += 2; chomp($lines[$i]); @se_theta = split(' ', $lines[$i]); $result{'SE_THETA'} = "@se_theta"; if ($lines[$i + 4] =~ /OMEGA/) { do { $i++; } until ($lines[$i] =~ /^ ?ETA1/); $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @se_omega = split(' ', $str); $i += 2; while ($lines[$i] =~ /^ ?ETA/) { $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @se_omega = (@se_omega, split(' ', $str)); $i += 2; }; $result{'SE_OMEGA'} = "@se_omega"; } if ($lines[$i + 2] =~ /SIGMA/) { do { $i++; } until ($lines[$i] =~ /^ ?EPS1/); $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @se_sigma = split(' ', $str); $i += 2; while ($lines[$i] =~ /^ ?EPS/) { $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @se_sigma = (@se_sigma, split(' ', $str)); $i += 2; }; $result{'SE_SIGMA'} = "@se_sigma"; } } } return %result; } sub ConvEStrToNum { my $str = shift @_; my @value = split(/ /, $str); foreach (@value) { $_ += 0; } return (@value); } 1;
*OUTPUT ファイルからの情報抽出 -Web 上で実行 --[[記事>http://blog.goo.ne.jp/hkasai/e/353d1311ff4a4d1350d9d8c574f7bc06]] --[[記事(追記)>http://blog.goo.ne.jp/hkasai/e/65ff65b3aec7d8a12995ec670553625f]] --実行場所 http://homepage1.nifty.com/hkasai/NMonal/NMonal.html *複数の OUTPUT ファイルから情報を抽出 -あるフォルダ内にある OUTPUT ファイルすべてから必要な情報を抽出する. --フォルダ内に OUTPUT ファイル以外のファイルが保存されていても構わない.OUTPUT ファイルのみを認識して,以下の作業が自動的に行われる. -使い方 --1. 下のプログラム (ReadNMoutMulti.pl および NMoutAnal.pl) をひとつのフォルダに保存する --2. Perl をインストールしておく.([[Perl]] 参照) --3. 以下のように実行する.結果は CSV ファイルに出力される.Summary.csv は使用者が任意につける名前.何でもよい. ### カレントフォルダの OUTPUT をすべて対象とする場合 ### C:\nmv\run>perl ReadNMoutMulti.pl . > Summary.csv ### カレントフォルダの下の OUT フォルダの中のファイルを対象とする場合 ### C:\nmv\run>perl ReadNMoutMulti.pl out > Summary.csv *注意 -COV ステップのエラー検出には未対応です.==> 対応しました. -結果の保証はいたしかねます. *ReadNMoutMulti.pl use strict; require 'NMoutAnal.pl'; my $ThisScriptName = "ReadNMoutMulti.pl"; if (@ARGV != 1) { print "Usage: perl $ThisScriptName FOLDER_name\n\n"; die; } my $dirname = shift @ARGV; my @result_all; opendir(DIR, $dirname) or die "$dirname: $!"; while (defined(my $fname = readdir(DIR))) { next if ($fname =~ /pl$/); next unless (-f "$dirname\\$fname"); open(FILE, "$dirname\\$fname") or die "$dirname\\$fname: $!"; my $isOutputFile = 0; while (defined(my $line = <FILE>)) { if ($line =~ "DEVELOPED AND PROGRAMMED BY STUART BEAL AND LEWIS SHEINER" ) { $isOutputFile = 1; } } close(FILE); if ($isOutputFile) { my %result1 = &NMoutAnal("$dirname\\$fname"); $result1{'FNAME'} = $fname; push(@result_all, \%result1); } } closedir(DIR); my $max_ntheta = 0; my $max_nomega = 0; my $max_nsigma = 0; foreach my $res1 (@result_all) { if ($res1->{'NTHETA'} > $max_ntheta) { $max_ntheta = ${$res1}{'NTHETA'}; } if ($res1->{'NOMEGA'} > $max_nomega) { $max_nomega = ${$res1}{'NOMEGA'}; } if ($res1->{'NSIGMA'} > $max_nsigma) { $max_nsigma = ${$res1}{'NSIGMA'}; } } print "Output,EST Status,COV Status,NIndiv,Nobs,OBJ"; for (1..$max_ntheta) { print ",TH$_"; } for (1..$max_nomega) { print ",OM$_"; } for (1..$max_nsigma) { print ",SG$_"; } for (1..$max_ntheta) { print ",SETH$_"; } for (1..$max_nomega) { print ",SEOM$_"; } for (1..$max_nsigma) { print ",SESG$_"; } print "\n"; my @values; my $COV_status; foreach my $res1 (@result_all) { $COV_status = "Success"; if ($res1->{'COV_STATUS'} == 0) { $COV_status = "Failure"; } elsif ($res1->{'COV_STATUS'} == -1) { $COV_status = "Not Implemented"; } print "$res1->{'FNAME'}"; print ",$res1->{'STATUS'}"; print ",$COV_status"; #COV status print ",$res1->{'NINDIV'}"; print ",$res1->{'NOBS'}"; print ",$res1->{'OBJ'}"; @values = &ConvEStrToNum($res1->{'THETA'}); print ",", join(",", @values); if ($res1->{'NTHETA'} < $max_ntheta) { foreach my $i (($res1->{'NTHETA'} + 1)..$max_ntheta) { print ",."; } } @values = &ConvEStrToNum($res1->{'OMEGA'}); print ",", join(",", @values); if ($res1->{'NOMEGA'} < $max_nomega) { foreach my $i (($res1->{'NOMEGA'} + 1)..$max_nomega) { print ",."; } } @values = &ConvEStrToNum($res1->{'SIGMA'}); print ",", join(",", @values); if ($res1->{'NSIGMA'} < $max_nsigma) { foreach my $i (($res1->{'NSIGMA'} + 1)..$max_nsigma) { print ",."; } } @values = &ConvEStrToNum($res1->{'SE_THETA'}); print ",", join(",", @values); if ($res1->{'NTHETA'} < $max_ntheta) { foreach my $i (($res1->{'NTHETA'} + 1)..$max_ntheta) { print ",."; } } @values = &ConvEStrToNum($res1->{'SE_OMEGA'}); print ",", join(",", @values); if ($res1->{'NOMEGA'} < $max_nomega) { foreach my $i (($res1->{'NOMEGA'} + 1)..$max_nomega) { print ",."; } } @values = &ConvEStrToNum($res1->{'SE_SIGMA'}); print ",", join(",", @values); if ($res1->{'NSIGMA'} < $max_nsigma) { foreach my $i (($res1->{'NSIGMA'} + 1)..$max_nsigma) { print ",."; } } print "\n"; } *NMoutAnal.pl use strict; sub NMoutAnal { if (@_ != 1) { print "Irregular arguments.\n\n"; die; } my $output_file = shift @_; if (not -e $output_file) { print "File not found: $output_file\n\n"; die; } open(OUTPUT, $output_file) or die "$!"; my @lines = <OUTPUT>; my $nlines = @lines; close(OUTPUT); my %result; my $problem; my $tmp; my $nobs; my $nindiv; my $del; my $status; my $obj; my @theta; my $ntheta; my $str; my @omega; my $nomega; my @sigma; my $nsigma; my @se_theta; my @se_omega; my @se_sigma; foreach my $i (0..($nlines - 1)) { if ($lines[$i] =~ /PROBLEM NO./) { $i++; chomp($lines[$i]); $problem = $lines[$i]; $problem =~ s/^ +//; $problem =~ s/ +$//; $result{'PROBLEM'} = $problem; } elsif ($lines[$i] =~ /OBS RECS/) { chomp($lines[$i]); ($tmp, $nobs) = split(/: +/, $lines[$i]); $result{'NOBS'} = $nobs; } elsif ($lines[$i] =~ /OF INDIVIDUALS/) { chomp($lines[$i]); ($tmp, $nindiv) = split(/: +/, $lines[$i]); $result{'NINDIV'} = $nindiv; } elsif ($lines[$i] =~ /MINIMIZATION/) { chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '0') { $del = 1; } $status = substr($lines[$i], $del); $result{'STATUS'} = $status; } elsif ($lines[$i] =~ /MINIMUM VALUE OF OBJ/) { do { $i++; } until ($lines[$i] =~ /[\-\d\.]+/); $obj = $&; $result{'OBJ'} = $obj; } elsif ($lines[$i] =~ /FINAL PARAMETER ESTIMATE/) { do { $i++; } until ($lines[$i] =~ /TH 1/); $i += 2; chomp($lines[$i]); @theta = split(' ', $lines[$i]); $ntheta = @theta; $result{'NTHETA'} = $ntheta; $result{'THETA'} = "@theta"; if ($lines[$i + 4] =~ /OMEGA/) { do { $i++; } until ($lines[$i] =~ /^ ?ETA1/); $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @omega = split(' ', $str); $i += 2; while ($lines[$i] =~ /^ ?ETA/) { $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @omega = (@omega, split(' ', $str)); $i += 2; }; $nomega = @omega; $result{'NOMEGA'} = $nomega; $result{'OMEGA'} = "@omega"; } if ($lines[$i + 2] =~ /SIGMA/) { do { $i++; } until ($lines[$i] =~ /^ ?EPS1/); $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @sigma = split(' ', $str); $i += 2; while ($lines[$i] =~ /^ ?EPS/) { $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @sigma = (@sigma, split(' ', $str)); $i += 2; }; $nsigma = @sigma; $result{'NSIGMA'} = $nsigma; $result{'SIGMA'} = "@sigma"; } } elsif ($lines[$i] =~ /STANDARD ERROR/) { do { $i++; } until ($lines[$i] =~ /TH 1/); $i += 2; chomp($lines[$i]); @se_theta = split(' ', $lines[$i]); $result{'SE_THETA'} = "@se_theta"; if ($lines[$i + 4] =~ /OMEGA/) { do { $i++; } until ($lines[$i] =~ /^ ?ETA1/); $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @se_omega = split(' ', $str); $i += 2; while ($lines[$i] =~ /^ ?ETA/) { $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @se_omega = (@se_omega, split(' ', $str)); $i += 2; }; $result{'SE_OMEGA'} = "@se_omega"; } if ($lines[$i + 2] =~ /SIGMA/) { do { $i++; } until ($lines[$i] =~ /^ ?EPS1/); $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @se_sigma = split(' ', $str); $i += 2; while ($lines[$i] =~ /^ ?EPS/) { $i++; chomp($lines[$i]); $del = 0; if (substr($lines[$i], 0, 1) eq '+') { $del = 1; } $str = substr($lines[$i], $del); @se_sigma = (@se_sigma, split(' ', $str)); $i += 2; }; $result{'SE_SIGMA'} = "@se_sigma"; } } } # COV ステップエラーの検出 my $COV_status = -1; # NOT IMPLEMENTED foreach my $line (@lines) { if ($line =~ /COVARIANCE STEP OMITTED.*$/) { my ($tmp, $COV_exec) = split(/:/, $&); if ($COV_exec =~ /NO/) { $COV_status = 1; # IMPLEMENTED } } } if ($COV_status == 1) { # COV ステップが実行されている if (!($se_theta[0] > 0)) { $COV_status = 0; } } $result{'COV_STATUS'} = $COV_status; return %result; } sub ConvEStrToNum { my $str = shift @_; my @value = split(/ /, $str); foreach (@value) { $_ += 0; } return (@value); } 1;

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー