たっぴ(パソコン質問掲示板)

ログイン

メニュー
■ トップ
■ 質問する
■ 回答を見る・回答する
■ 参加者のひろば / テーマ別
■ コミュニケーション道場
■ 「たっぴ」の使い方
■ 「たっぴ」のルール・心得

エキスパート トータルランキング
Rank ニックネーム E-Point
1 位 sriver 1372 p
2 位 げんき(^^)/ 810 p
3 位 うにゅ 607 p
4 位 mory 512 p
5 位 saru 510 p
6 位 Clark 481 p
7 位 taknt 474 p
8 位 459 p
9 位 あき◆ 387 p
10 位 aice 367 p
※月間ランキング参加者がありませんでした。



E-Point還元プログラム
E-Point 月間獲得ポイントより回答者様へ現金を還元いたします。

対象還元金額
全員に(E-Point)×20円
支払いは5,000円以上からとなります。
還元金の支払いはご指定銀行口座への振込みとなります。

『マナーの良い質問者』マーク
以下の条件を満たす質問者様には
  『マナーの良い質問者』マーク

が付きます。
  1. 登録していて
  2. 「終了」していない質問がひとつ以下で
  3. 終了した質問で「○○○○○」という言葉の投稿がある
3番目の条件はひらがなです。もうお判りですね。(漢字、カタカナもOKかも。。。)
ぜひマークをGetしてください。









《戻る

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


( 参照数:302   日平均:0.6 )
 
〜 回答の受付を終了しました 〜


回答、お礼・報告などメッセージの追加

ニックネーム:

まったく新しい内容の質問、質問者以外の方の質問は、メニューの「質問する」から新たに質問してください。

詳細: 内容を詳しく言うと。。。

※「たっぴ」に登録すると質問にポイントが付けられます。 その他便利な機能も使えます!》新規登録 》Help

※http://.....は自動的にハイパーリンクに変換します。
※<pre></pre>が使用できます。     ※引用は行の先頭に「>」を付けてください。自動的に色が付きます。




利用規約 特定商取引に関する法律に基づく表記 プライバシーポリシー 問合せ