No. | 質問・回答 | おれい |
|
[125090] Perlのテキストファイル読み込み時の検索について |
|
|
使用しているOS: Windows 7
使用しているPCのメーカー/機種/型番:
関係するアプリケーション名/バージョン:
関係する機器の機種名/型番:
エラーメッセージなど(原文のまま):
その他:
以下、とあるコマンドを実施した結果が書き込まれたテキストファイルがあります。
便宜上、行番号も書かせていただきます。実際は記載はありません
comand.txt
01 ## Start Comand 001 ##
02 ## End Comand 001 ##
03
04 ## Start Comand 002 ##
05 TEST
06 -----------------
07 ## End Command 002 ##
08
09 ## Start Comand 003 ##
10 TEST
11 -----------------
12 CR12345
13 ## End Command 003 ##
14
15 ## Start Comand 004##
16 TEST
17 -----------------
18 CR33333
19 ## End Command 004 ##
・・・・・
テキストに表示されるパターンとしては3パターンになります。
ちなみに一部抜粋の為、順不動で色々ならんでいます。
1:対象が存在しない場合:01-02
2:対象は存在するが、割り当てられていない場合:04-07
3:対象は存在し、割り当てられている場合:09-13,15-19
これをうまい具合に、検索をかけてこんな風に割り振りたいと思っています。
とりあえずはpritかなんかで表示までできればと思います。うまい検索の方法はありますでしょうか?
トータル :4
対象なし :1
割り当てなし:1
割り当てあり:2
001 対象なし
002 割り当てなし
003 割り当てあり CR12345
004 割り当てあり CR33333
Perl開発 (未登録) 2016年6月28日18:26
|
|
|
|
[125091] |
Windows 7なのでActivePerlですよね。
Windows 10 Pro 64bitに「ActivePerl-5.24.0.2400-MSWin32-x64-300558.exe」を
インストールしてサンプルを作成してみました。
ファイル有無のチェック以外のエラー処理やファイル内データの不整合チェックは
一切していませんので、追加して完成させてください。
以下のコードを拡張子「.pl」で保存し、同じフォルダにcomand.txtを置いて
コマンドラインで、perl 保存名.pl で実行してください。
comand.txtの行番号は取り除いてください。
--- ここから ---
$inputfile = "comand.txt";
$st_flag = "0";
$st_no = "000";
$te_flag = "0";
$cr_flag = "0";
$cr_data = " ";
$ed_flag = "0";
$ed_no = "000";
$ix1 = 0;
$total = 0;
$taisyounasi = 0;
$wariatenasi = 0;
$wariateari = 0;
open (FILE, $inputfile) or die "$!";
while (<FILE>) {
if (substr("$_", 0, 8) eq "## Start") {
$st_flag = "1";
$st_no = substr("$_", 16, 3);
}
if (substr("$_", 0, 4) eq "TEST") {
$te_flag = "1";
}
if (substr("$_", 0, 2) eq "CR") {
$cr_flag = "1";
$cr_data = substr("$_", 0, 7);
}
if (substr("$_", 0, 6) eq "## End") {
$ed_flag = "1";
$ed_no = substr("$_", 14, 3);
$total++;
if ($te_flag eq "1") {
if ($cr_flag eq "1") {
$wariateari++;
$syoritbl[$ix1] = "$st_no 割り当てあり $cr_data";
} else {
$wariatenasi++;
$syoritbl[$ix1] = "$st_no 割り当てなし";
}
} else {
$taisyounasi++;
$syoritbl[$ix1] = "$st_no 対象なし";
}
$ix1++;
$st_flag = "0";
$st_no = "000";
$te_flag = "0";
$cr_flag = "0";
$cr_data = " ";
$ed_flag = "0";
$ed_no = "000";
}
}
close (FILE);
print "トータル :" . $total . "\n";
print "対象なし :" . $taisyounasi . "\n";
print "割り当てなし:" . $wariatenasi . "\n";
print "割り当てあり:" . $wariateari . "\n";
print "\n";
foreach $tbl (@syoritbl) {
print "$tbl\n";
}
--- ここまで ---
げ (未登録) 2016年6月29日14:24
|
|
|
|
[125092] |
行頭の半角スペースが削除されてしまうので、半角スペース2文字を「▲」に
置換したコードを再アップします。
メモ帳に貼り付けて「▲」を半角スペース2文字に置換して使用してください。
--- ここから ---
$inputfile = "comand.txt";
$st_flag = "0";
$st_no = "000";
$te_flag = "0";
$cr_flag = "0";
$cr_data = "▲▲▲ ";
$ed_flag = "0";
$ed_no = "000";
$ix1 = 0;
$total = 0;
$taisyounasi = 0;
$wariatenasi = 0;
$wariateari = 0;
open (FILE, $inputfile) or die "$!";
while (<FILE>) {
▲▲if (substr("$_", 0, 8) eq "## Start") {
▲▲▲▲$st_flag = "1";
▲▲▲▲$st_no = substr("$_", 16, 3);
▲▲}
▲▲if (substr("$_", 0, 4) eq "TEST") {
▲▲▲▲$te_flag = "1";
▲▲}
▲▲if (substr("$_", 0, 2) eq "CR") {
▲▲▲▲$cr_flag = "1";
▲▲▲▲$cr_data = substr("$_", 0, 7);
▲▲}
▲▲if (substr("$_", 0, 6) eq "## End") {
▲▲▲▲$ed_flag = "1";
▲▲▲▲$ed_no = substr("$_", 14, 3);
▲▲▲▲$total++;
▲▲▲▲if ($te_flag eq "1") {
▲▲▲▲▲▲if ($cr_flag eq "1") {
▲▲▲▲▲▲▲▲$wariateari++;
▲▲▲▲▲▲▲▲$syoritbl[$ix1] = "$st_no 割り当てあり $cr_data";
▲▲▲▲▲▲} else {
▲▲▲▲▲▲▲▲$wariatenasi++;
▲▲▲▲▲▲▲▲$syoritbl[$ix1] = "$st_no 割り当てなし";
▲▲▲▲▲▲}
▲▲▲▲} else {
▲▲▲▲▲▲$taisyounasi++;
▲▲▲▲▲▲$syoritbl[$ix1] = "$st_no 対象なし";
▲▲▲▲}
▲▲▲▲$ix1++;
▲▲▲▲$st_flag = "0";
▲▲▲▲$st_no = "000";
▲▲▲▲$te_flag = "0";
▲▲▲▲$cr_flag = "0";
▲▲▲▲$cr_data = "▲▲▲ ";
▲▲▲▲$ed_flag = "0";
▲▲▲▲$ed_no = "000";
▲▲}
}
close (FILE);
print "トータル :" . $total . "\n";
print "対象なし :" . $taisyounasi . "\n";
print "割り当てなし:" . $wariatenasi . "\n";
print "割り当てあり:" . $wariateari . "\n";
print "\n";
foreach $tbl (@syoritbl) {
▲▲print "$tbl\n";
}
--- ここまで ---
げ (未登録) 2016年6月29日14:33
|
|
|
|
[125093] |
ありがとうございます。
なるほど、1行ずつよんで、フラグをつけていくんですね。
スタートがあれば1をたてる
TESTがあれば1をたてる
CRxxxがあれば1をたてる
エンドがあれば1をたてる
そこまでみて、フラグの個数を見てはんだん。配列にいれる
エンドでおわりなので、フラグを初期化
次の行をみる。ってかんじですね
if文とか配列がわかっていないところがありましたので、もう少し勉強します。
Perl開発 (未登録) 2016年6月29日16:57
|
|
|
|
( 参照数:9858 日平均:3.4 ) |
|
〜 回答の受付を終了しました 〜 |