• ベストアンサー

ファイルの一部を別のファイルの指定箇所にかき込みたい

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 ********* こんなバッチファイルを作成して実行しています。 どなたかお力をお貸し願えるとありがたいです。 よろしくお願いします。

  • Perl
  • 回答数5
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答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; だけでいいです。

fanvankai
質問者

お礼

なるほど、そういうことだったんですね。 重ねて感謝、感謝です、有り難うございました。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3で >print $B; >として としか書いてませんが、 B.txt に書き出さない場合は、 #open(B, ">B.txt"); print $B; #close(B); のようにB.txtファイル書き出しに関する部分をコメントアウトするか削除して下さい。

fanvankai
質問者

補足

#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)
回答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 でよいです

fanvankai
質問者

お礼

丁寧な解答ありがとうございました。 とても助かりました。 また、よろしくお願いします。

  • ren10
  • ベストアンサー率52% (9/17)
回答No.2

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 に変換後のデータが書きこまれます。 こんな感じで期待通りの結果が得られるでしょうか?

fanvankai
質問者

お礼

親切な解答ありがとうございました。 また、よろしくお願いします。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答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);

fanvankai
質問者

お礼

早速の解答ありがとうございました。 また、よろしくお願いします。

関連するQ&A

  • ファイル読み込みマッチングについて

    現在二つのファイルをつき合わせて一致しない ファイルを出力するようなものを作っています。 例ですが。 ---a.txtココカラ--- aaa bbb ccc ---ココマデ--- ---b.txtココカラ--- aaa ccc ddd fff ---ココマデ--- 上記ファイルを照らし合わせて 以下のファイルを出力 ---c.txtココカラ--- bbb ---ココマデ--- のように出力させたいのですが。 自分の作成したものは ---a.plココカラ--- open(IN1,"a.txt") || die $!; open(IN2,"b.txt") || die $!; open(OUT,">c.txt") || die $!; sub hikaku { while(<IN2>){ if($a eq $b){ return; } } print OUT "$a"; return; } while(<IN1>){ $a = $_; &hikaku; } close(IN1); close(IN2); close(OUT); ---ココマデ--- いろいろテストをしてわかったことですが サブルーチンの while(<IN2>) そのままに なる一回しか回らないことがわかりました。 これは偽になった後、サブルーチンを抜けまた 回ってきた時に偽と判断されるからでしょうか? プログミング自体始めたばかりなので、こんなん あかんに決まってるやん!とか一からだなこれ!! とか導いていただけるなら厳しいご指摘お待ちして おります。 長くなりましたがよろしくお願い致します!!

    • ベストアンサー
    • Perl
  • ファイル操作

    ファイル操作について、プログラムがうまくできないので教えていただきたいです。 作っているのは、txtファイルを読み込んで、置換の処理をした結果を、test.txtファイルに書き出したいのです。 質問なのですが、ここでtest.txtはあらかじめ作成しておかなければならないのでしょうか。自動で作成させる方法があれば、教えてください。 -----------------data.txt------------------------ rabbitうさぎappleりんごcoffeeコーヒー ------------------------------------------------ -----------------apple.pl----------------------- open(FILEHANDLE,"data.txt"); while($str=<FILEHANDLE>){ $str=~s/apple/青りんご/; } close(FILEHANDLE); open(FILEHANDLE,"test.txt"); print FILEHANDLE $str; close(FILEHANDLE); ------------------------------------------------- また、コマンドプロンプトの結果は次のとおりです。 C:\Perl>perl -cw apple.pl apple.pl syntax OK C:\Perl>perl apple.pl C:\Perl> Perl初心者なため、詳しく教えていただけると助かります。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 指定文字を含むファイル名の取得

    こんばんは、質問させてください。 今あるディレクトリのファイルを取得しようと考えています。ですが、取得したいファイルはファイル名末尾が"tmp"となったものだけを取得したいと考えています。 $dir = "/home/httpd/test/"; while($fnm[] = readdir($dir)); closedir($dir); sort($fnm); reset($fnm); while($a = each($fnm)){ if(($a[1] != ".") and ($a[1] != "..") and ($a[1] != "")){ $file_data[] = $a[1]; } } ってとこまでしかわからず、欲しくないファイル名まで$file_dataに入ってしまいます。 aaaaa_1111.txt(取得したくない) aaaaa_1111.txt.tmp(取得したい) aaaaa_1111.tmp.txt(取得したくない) 末尾が"tmp"のみ欲しいです。 すみませんが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • [perl5.8] SJISで出力したはずのファイルにutf8フラグが

    1)SJISで以下の2行を含むファイルを作成し、   sjis.txtという名前で保存します。 "ホツカイドウ" "北海道" 2)SJISで以下のスクリプトを作成します。 #=== one.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis.txt'; my $outfile = 'sjis2.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print OU @lines; close(OU); 3)SJIJSで以下のスクリプトを作成します #=== two.pl === use encoding 'Shift_JIS'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(Shift_JIS)"; my $infile = 'sjis2.txt'; my $outfile = 'sjis3.txt'; open(IN, "<$infile"); @lines = <IN>; close(IN); open(OU, ">$outfile"); print @lines; close(OU); 4)one.pl を実行し、続いてtwo.plを実行すると 以下のエラーがコマンドプロンプトに表示されます。 #------------------------------------------- D:\zipcode\utf8mondai>two.pl Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "・趣セゑスカ・イ・・セ橸スウ" Wide character in print at D:\zipcode\utf8mondai\two.pl line 14. "蛹玲オキ驕・ これは何故なのでしょうか。 エラーメッセージは、printしようとしている 文字列にutf8フラグがついているという意味 らしいです。

    • ベストアンサー
    • Perl
  • Rubyでテキスト内容を別のテキストに一度に出力したいのですが、どのよ

    Rubyでテキスト内容を別のテキストに一度に出力したいのですが、どのようにすればよいのでしょうか。 rubyはさっきはじめたところです。 一通り検索しましたが、やり方がヒットしませんでした。 a.txtの内容: aaaaa bbbbb ccccc ... を、ファイルコピーではなくoutput.txtに出力したいのですが、 a = open("a.txt") o = open("output.txt",w) ??? a.close o.close で、???の部分にどのような処理を書けばよいのでしょうか。 putsやwriteで書いてみたのですが、(o.write a) #<File:0x28a4450> と出力され、(ファイルオブジェクトのアドレス?)、a.txtの内容が出力出来ませんでした。 a.xxx のようにするのかな、と予想しますが、方法は問いませんので、ご教示いただけないでしょうか。

    • ベストアンサー
    • Ruby
  • 文字列を指定して,別のファイルでその文字列が存在する行を出力する

    いつもお世話になっております. 環境はWindows XP Pro でActiveperlを用いてプログラムをしております. この度,皆様にご意見をうかがいたいのは,「文字列を指定して,別のファイルでその文字列が存在する行を出力する」という内容です. まず,以下のテキストファイルがあります. data.txt ---------------------- A BA C DA E FA G sansyo.txt ----------------------------- B D F ------------------------------- 処理として,data.txtでsansyo.txtの行が "含まれる"行数を出力する ------------------------------- output.txt ------------------------------- 2 4 6 ここで自分なりにプログラムを組んでみました. ----------------------------------- open(FILE, "sansyo.txt"); open(FILE2,"data.txt"); @file = <FILE>; close(FILE); @file2 = <FILE2>; close(FILE2); foreach $line (@file) { foreach $line2 (@file2) { if ($line =~ $line2){ $hit = $.; } open(NEWFILE, " >> output.txt") or die "$!"; print NEWFILE $hit; close(NEWFILE); } } #ここまで ------------------------------------- ですが,永久ループに入ってしまったようにファイルはできるのですが, 出力されてきません. 間違っている点をご指摘ください.

    • ベストアンサー
    • Perl
  • 指定列を抜き出す

    V1 , V2 , V3 , V4 , V5 , V6 5.9, 3.9, 0.7, 3.9, 5.8, 5.1 4.1, 6.4, 3.8, 3.3, 5.8, 9.3 3.1, 2.3, 1.8, 2.7, 3.6, 5.6 6.8, 4.2, 2.1, 3.3, 4.9, 5.1 2.3, 0.3, -1.7, -2.1, -1.7, 1.10 8.0, 4.7, 3.7, 6.9, 6.2, 5.5 さらに続く 上記のようなテキストデータがファイルAに入っており これからV1,V3,V5のデータだけを抽出し、 ファイルBに格納するプログラムを作成中なのですが、 データの読み込みと書き込みの部分は作成したのですが、 どのようにすれば抽出できますでしょうか? ソフトはVB6です。よろしくお願いします 'ファイル読み込み Open "C:\A.txt" For Input As #1 FlLen = LOF(1) txt = Input(FlLen, #1) Close #1 'ファイル書き込み Open "C:\B.txt" For Output As #1 Print #1, txt Close #1

  • perlプログラム

    (1)のプログラムではtest.txtの内容を表示することができました。 (2)ではaaaが表示されつづけると思いますが、何も表示されません。 なにかまちがっていると思いますが、わかりません。 よろしくお願いします。 --------------------------------------------------------------------------------- (1) --------------------------------------------------------------------------------- sub Main() { LAST:while(){ if(defined(open(FILE,"test.txt"))){ flock(FILE,1); while(<FILE>){ print $_; last LAST if($_ == 0); } } sleep(1); } close(FILE); } &Main(); ------------------------------------------------------------------------------- (2) ------------------------------------------------------------------------------- sub Main() { LAST:while(){ if(defined(open(FILE,"test.txt"))){ flock(FILE,1); while(<FILE>){ print "aaa";  ←変更箇所 last LAST if($_ == 0); } } sleep(1); } close(FILE); } &Main(); -------------------------------------------------------------------------------

  • ディレクトリ内の全ファイルをオープンする方法

    特定のディレクトリ内に存在する全てのファイルを順次オープン・クローズするプログラムを作成したいと思います。 例えば、特定のディレクトリに下記のファイルがあるとします。 A.txt B.txt このときにA.txtをオープンし内容を読み込みクローズし、次にB.txtを同じようにオープンし内容を読み込んでクローズするプログラムです。内容を読み込んで処理する部分は問題なく、また上記のように存在するファイルが決まっていれば何も問題はないのですが、下記の場合にはどのように存在するファイルを探せばよいのかがわかりません。 ・何ファイルあるかわからない ・存在するファイルは必ずテキスト ・ファイル名は決まっていない(perlで問題なく読み込めるファイル長) なお、特定のディレクトリに存在するファイルを順次全て読み込めればよいので、その読み込む順番にこだわりはありません。 どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • 配列を用いた文字置換

    初投稿です。よろしくお願いいたします。 kana2phone_rule.txtにはア+aという情報が五十音で入っています。01.txt.chaには愛+アイという情報が入っています。 以下のプログラムは01.txt.chaのプラスの後の要素 (アイ)を音表記(ai)に変換するというものです。 しかし変換の作業が行われない(アイ)ままファイルを吐き出してしまいます。 文字コードはEUC、改行コードLFで試しても、Jperlを用いてShift-JIS、CR+LFで試してもだめでした。 どこに問題があるのでしょうか。 分かりましたらよろしくお願いいたします。 open(IN,"kana2phone_rule.txt"); $j = 0; while($b=<IN>){ chomp $b; @list = split(/\+/, "$b"); $kana[$j] = "$list[0]"; $yomi[$j] = "$list[1]"; $j++; } close(IN); open(IN, "01.txt.cha"); open(OUT, "> kekka.txt"); while($a=<IN>){ chomp $a; @list2 = split(/\+/, "$a"); for($i=0; $i<=258; $i++){ $list2[1] = ~s/$kana[$i]/$yomi[$i]/g; } print OUT "$a [$list2[0]] $list2[1]\n"; } close(IN); close(OUT);

    • ベストアンサー
    • Perl