- ベストアンサー
ファイルの一部を別のファイルの指定箇所にかき込みたい
Perl初心者です アルファイルの一部を別のファイルの指定箇所にかき込みたいのですが、どのようにすればいいのか分かりません。 ファイルAにはデータが1行に1つ入っています。それをファイルBの指定した場所にかき込みたいです。 ファイルBはテキストファイルで 1:3年AaaaA組 2:今週の担当はAbbbA 3:月曜日の1限目はApppA 4:担当の先生はAqqqA 5:持ってくるものはArrrA 6:月曜日の2限目はAsssA 7:担当の先生はAtttA 8:持ってくるものはAuuuA という具合です。 以下同様のものが数組繰り返します。 AファイルにはA***Aの部分にかき込みたい情報が1行づつのデータになっています。 いろいろ探してみて、見よう見まねで ************* #test.pl open(A, "<A.txt"); while (<A>) { @lines = <>; } open(B, ">B.txt"); while (<B>) { s/AaaaA/$lines[1]/g; s/AbbbA/$lines[2]/g; print B; } close(B); close(A); #end ********** こんなものをつくってみましたが、さっぱりダメでした。 WIN MEで ********* jperl test.pl > test.txt ********* こんなバッチファイルを作成して実行しています。 どなたかお力をお貸し願えるとありがたいです。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#4>実行したあとB.txtのファイルの中身が空っぽになってしまう まさに、危惧していたとおり・・ 再度書きますが B.txt に書き出さない場合は、 open(B, ">B.txt"); print B $B; close(B); の部分のopen と close を削除して print $B; だけにすればいいです。 #4でいうと 最後の open(C, ">C.txt"); print $C; close(C) のような部分は、C.txt に書き出しをしていないので、 print $C; だけでいいです。
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#3で >print $B; >として としか書いてませんが、 B.txt に書き出さない場合は、 #open(B, ">B.txt"); print $B; #close(B); のようにB.txtファイル書き出しに関する部分をコメントアウトするか削除して下さい。
補足
#3のアドバイスを元にして、実行をさせていただきました。そうすると、実行したあとB.txtのファイルの中身が空っぽになってしまうので、ちょっとだけ下手な工夫をしました。B.txtはテンプレートで再度使うこともあるからです。 以下のバッチファイルを作って実行しました ******** jperl copy.pl B.txt > C.txt jperl copy.pl B.txt > D.txt jperl test01.pl > text01.txt jperl test02.pl > text02.txt ********* それぞれのファイルの中身は copy.plが **************** while(<>) { print; } # end **************** test01.plが ***************** open(A, "<A.txt"); @lines = <A>; close(A); chomp @lines; if(open(C, "<C.txt")){ local $/ = undef; $C = <C>; close(C); } $C=~ s/AaaaA/$lines[0]/g; $C=~ s/AbbbA/$lines[1]/g; $C=~ s/AcccA/$lines[2]/g; $C=~ s/AdddA/$lines[3]/g; $C=~ s/AeeeA/$lines[4]/g; $C=~ s/AfffA/$lines[5]/g; $C=~ s/AgggA/$lines[6]/g; $C=~ s/AhhhA/$lines[7]/g; $C=~ s/AiiiA/$lines[8]/g; $C=~ s/AjjjA/$lines[9]/g; $C=~ s/AkkkA/$lines[10]/g; $C=~ s/AlllA/$lines[11]/g; $C=~ s/AmmmA/$lines[12]/g; $C=~ s/AnnnA/$lines[13]/g; open(C, ">C.txt"); print $C; close(C) ******************* test02.plが ******************** open(A, "<A.txt"); @lines = <A>; close(A); chomp @lines; if(open(D, "<D.txt")){ local $/ = undef; $D = <D>; close(D); } $D=~ s/AaaaA/$lines[14]/g; $D=~ s/AbbbA/$lines[15]/g; $D=~ s/AcccA/$lines[16]/g; $D=~ s/AdddA/$lines[17]/g; $D=~ s/AeeeA/$lines[18]/g; $D=~ s/AfffA/$lines[19]/g; $D=~ s/AgggA/$lines[20]/g; $D=~ s/AhhhA/$lines[21]/g; $D=~ s/AiiiA/$lines[22]/g; $D=~ s/AjjjA/$lines[23]/g; $D=~ s/AkkkA/$lines[24]/g; $D=~ s/AlllA/$lines[25]/g; $D=~ s/AmmmA/$lines[26]/g; $D=~ s/AnnnA/$lines[27]/g; open(D, ">D.txt"); print $D; close(D); ********************* とうものです。A.txtのデータの数が変わったので、少し扱う行数が変わっています。 きっと、ぶさいくどころではないものだとは思うのですが、これで希望が叶いました。 本当にありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
open(A, "<A.txt"); @lines = <A>; close(A); chomp @lines; if(open(B, "<B.txt")){ local $/ = undef; $B = <B>; close(B); } $B=~ s/AaaaA/$lines[0]/g; $B=~ s/AbbbA/$lines[1]/g; $B=~ s/ApppA/$lines[2]/g; $B=~ s/AqqqA/$lines[3]/g; $B=~ s/ArrrA/$lines[4]/g; $B=~ s/AsssA/$lines[5]/g; $B=~ s/AtttA/$lines[6]/g; $B=~ s/AuuuA/$lines[7]/g; open(B, ">B.txt"); print B $B; close(B); ---------------------------------------------------------------- B.txt をテンプレートとして使っていて置き換える必要がなく、 置き換えた結果をtest.txt として得るのであれば、 print B $B; は、 print $B; として jperl test.pl > test.txt として下さい。 B.txt を置き換える場合は、 jperl test.pl でよいです
お礼
丁寧な解答ありがとうございました。 とても助かりました。 また、よろしくお願いします。
- ren10
- ベストアンサー率52% (9/17)
open(A, "A.txt"); open(B, "B.txt"); while(<B>){ $tmp = <A>; chop $tmp; s/A...A/$tmp/g; print; } close(A); close(B); コマンドラインより jperl test.pl > test.txt これで test.txt に変換後のデータが書きこまれます。 こんな感じで期待通りの結果が得られるでしょうか?
お礼
親切な解答ありがとうございました。 また、よろしくお願いします。
- moon_night
- ベストアンサー率32% (598/1831)
open(B, ">B.txt"); でOPENした時点でB.txtの内容は消えてしうので想定通りに動作しません。 あと、使用しない test.txtを指定しても意味がないです。 jperl test.pl > test.txt 単に jperl test.pl で動くと思います。 open(B1, "<B.txt"); @line_b = <B1>; close(B1); open(A, "<A.txt"); @line_a = <A>; close(A); open(B2, ">B.txt"); $i=0; foreach (@line_b) { if ($_ =~ /A(.+)A/) { s/A(.+)A/$line_a[$i]/g; $i++; } print B2; } close(B2);
お礼
早速の解答ありがとうございました。 また、よろしくお願いします。
お礼
なるほど、そういうことだったんですね。 重ねて感謝、感謝です、有り難うございました。