68user's page 掲示板

Prev< No. 2251〜2256> Next  [最新発言に戻る] [過去ログ一覧]
No. 2251 # ミング [E-mail] 2001/11/07 (水) 18:42:55
こんにちは。いつもお世話になってます。

Perlについて質問があります。

各ファイルに ”ー1”と ”ー2”が含まれた行があって、それを区切りに2つのファイルに分けたいのですが、なかなかうまくいきません。

EXAMPLE:
*File0001の内容ーー

0001ー1

C100 Open
C101 NG

0001ー2

C102 Open
C103 Open

*File2の内容ーー

0002ー1

C200 Open
C201 NG
C202 Open

0002ー2

C203 Open
C204 NG

この0001と0002の2つのファイルを0001ー1と0001ー2、0002ー1と0002ー2の4つのファイルに分けたいのです。

下のスクリプトは全然間違ってるのですが、/-1/ と /-2/ があった行数を記憶して、後から 行の番号を比較してどうにか区切ろうと思ったのですが、やっぱり最初は$barcode22=0だし、全然駄目です。

普通、どのようにするのか教えて頂けませんか?

よろしくお願いします。

sub read_file_to_array { my($file)=$filename;
        
        open (FILE, "<$dir\\$database\\Defect\\$file") or die "Can't open $file\n";
          $line=0;
            while (<FILE>){
            
            if ($_ =~ /-1/) {$barcode11=$.};
            if ($_ =~ /-2/) {$barcode22=$.};
                                                          
            if ($line > $barcode22) {print "$_ ";}#試しにSTDOU#に出力してみるだけ
                                                            }
            $line++;
                                                    }

No. 2252 # ナナシサソ 2001/11/07 (水) 23:34:55
動くかわからんけどとりあえずできた

sub read_file_to_array { #←?
        my $file = shift;
        open (FILE, "<$dir\\$database\\Defect\\$file") or die "Can't open $file\n";
        open (OUT1, ">$dir\\$database\\Defect\\${file}_1") or die;
        open (OUT2, ">$dir\\$database\\Defect\\${file}_2") or die;
        my ($flag1, $flag2);
        while (<FILE>) {
                if ( /-1/ ) {
                        $flag1 = 1;
                }
                if ( /-2/ ) {
                        $flag2 = 1;
                        $flag1 = 0;
                }
                if ($flag2) {
                        print OUT2;
                        next;
                }
                if ($flag1) {
                        print OUT1;
                        next;
                }
        }
}

No. 2253 # ナナシサソ 2001/11/07 (水) 23:37:28
うぎょぎょ。。if ($flag2) {〜の部分の順番が逆になっちゃってるし。ダサ・・
closeしてないし・・終了時に閉じられるから大丈夫かアハハ

No. 2254 # 68user 2001/11/08 (木) 07:20:44
>>2251 ミング
必ずデータの先頭が .*-1 か .*-2 であるなら
    while (<FILE>) {
        if ( /-[12]/ ){
            chomp;
            open (OUT, ">$dir\\$database\\Defect\\$_") or die;
            next;
        }
        print OUT;
    }
かなぁと思うんですが、違うかな?

業務用プログラムかだとちゃんとエラーチェックしないとまずい
でしょうが、データの内容がある程度保証されているなら、こんな
テキトーな感じでよろしいかと思います。

No. 2255 # ミング [E-mail] 2001/11/08 (木) 14:47:58
ナナシサソさん、68userさん

出来ました!!
ご指導どうもありがとうございました。

No. 2256 # ミング [E-mail] 2001/11/08 (木) 17:54:35
二日連続の質問になってしまいますが、よろしくお願いします。

No.2251のInput file名は"Ab00010", "Cd00020", のように文字と数字からなっているのですが、Outputは別のDirに"Ab00010" "Ab00011" "Cd00020" "Cd00021"というように、/-2/の部分は”元のファイル名+1”というファイル名にしたいのですが、、、、

800ページあるらくだの本も一応買ってきたのですが全然分からないので、ウェブサイトで調べてみたのですが、唯一これかな?と思ったのが:

$string="abcd771gfds";
$string=~/(\W+)\s+(\d+)/;

とすると、$1=abcd, $2=7771, $string=abcd771gfds になる、とあったんですが、

試してみると$1=" ", $2=" ", $string="4294967295"になってしまい、訳が分からなくなってきたのですが、これは全然違うアプローチなんでしょうか?

どうしたら ”Ab00011”が作れるんでしょうか?

Prev< No. 2251〜2256> Next  [最新発言に戻る] [過去ログ一覧]