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
*********
こんなバッチファイルを作成して実行しています。
どなたかお力をお貸し願えるとありがたいです。
よろしくお願いします。
No.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;
だけでいいです。
No.4
- 回答日時:
#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のデータの数が変わったので、少し扱う行数が変わっています。
きっと、ぶさいくどころではないものだとは思うのですが、これで希望が叶いました。
本当にありがとうございました。
No.3
- 回答日時:
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
でよいです
No.1
- 回答日時:
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);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlでIEのクッキーを削除したい
-
perl ファイルのデータを編集し...
-
ファイル名を複数個配列で確保...
-
ファイルの一部を別のファイル...
-
バッチファイルの作り方(CSV→...
-
空白文字 \\f と\\v の違いに...
-
batファイルでrenameができませ...
-
htaccessで特定のディレクトリ...
-
VBAコードを張り付け後のエクセ...
-
perlをwindows環境でshift-jis...
-
ディレクトリ名を取得したい
-
ReadLineでの読み出し行を指定する
-
sprintfについて
-
VBでファイル分割の方法
-
LinuxのC言語で、ファイル名の...
-
C言語で正の整数n を受け取って...
-
FindFirstFileとFindNextFileで...
-
awkスクリプトでダブルクォーテ...
-
ExcelをCSV書き出す場合のシー...
-
perlでcsvファイルを読む(ダブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名を複数個配列で確保...
-
「パスが見つかりません」とい...
-
Visual Basicを使って三平方の...
-
C++でのテキストファイル読み込...
-
Fortranで1行飛ばして読み込む方法
-
同じようなソースなのですが片...
-
ifstream/ofstream について
-
どなたか教えて下さい。
-
Perl エラーログを指定の場所...
-
system関数と引数について
-
ファイルの一部を別のファイル...
-
perlで指定範囲を複数ファイル...
-
perlでIEのクッキーを削除したい
-
C言語初心者です。プログラミン...
-
一行だけ読込
-
ファイルを分割する。
-
日本語のマッチング(正規表現)
-
shellのコマンド deffの差分の...
-
perl ファイルのデータを編集し...
-
Pythonで非日本語のUnicode文字...
おすすめ情報