• 締切済み

perlで、後ろの行を読んで、前の行に書き込むには?

perl初心者です。 後ろの行を読んで、戻って、指定の行に、書き込む方法が、よくわかりません。 下記のようなファイルを読み込んで ---------------------------- アルファベット= 1A 2B 3C アルファベット= 1A 2B アルファベット= 1A 2B 3C 4D 5E 6F ------------------------------ 下記のように、「アルファベット=」にアルファベットを入れるには、どうしたらいいでしょうか? ------------------------------ アルファベット=ABC 1A 2B 3C アルファベット=AB 1A 2B アルファベット=ABCDEF 1A 2B 3C 4D 5E 6F -------------------------------- よろしくお願い致します。

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

みんなの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

後の行のデータを前の行の末尾に追加するには、1行毎の処理ができませんので、 一時的な配列を利用する等になるかと思います。以下は、簡単なコード例です。 use strict; my @block = (); while (my $line = <DATA>) { if ($line =~ /^アルファベット/) { print "$block[0]\n", @block[1 .. $#block] if @block; chomp $line; @block = ($line); } else { $block[0] .= substr($line, 1, 1); push @block, $line; } print "$block[0]\n", @block[1 .. $#block] if eof; } __DATA__ アルファベット= 1A 2B 3C アルファベット= 1A 2B アルファベット= 1A 2B 3C 4D 5E 6F

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.3

すでにあるファイルの末尾にデータ(文字)の追加はできますが、末尾以外への挿入は Perlの入出力機能では出来ません。 普通は、No.1さんのおっしゃる様にファイル全部を読み込んで変更してファイル全部を書き戻す処理になるでしょう。 処理速度を上げたいなら工夫の余地はありますが、プログラミングの初心者さんがトライすべきテーマでは無いと思います。

回答No.2

> 後ろの行を読んで、戻って、指定の行に、書き込む方法 そのままのアルゴリズムで。 書き込むときに1行分のlengthを変数に取っておき、 書き直したい行を発見したらseekで戻る。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

とりあえずお手軽に処理するなら、 ※メモリに全てを読み込んで処理をしたあと、メモリから元のファイルに上書きする。 って方法があります。最近のPCはメモリーも大きいですし、仮想記憶の機能もあるので、そうとう大きなファイルをメモリーで処理しても、問題ないでしょう。 なお、一発でうまくいくとは限らないので、とりあえず別ファイルに書き出し、OKになったらリネームする方法がいいかもしれません。

関連するQ&A

  • linuxでファイル内容の置換について

    ファイルのabcdefを含む行に対して、最後の「-」以外の「-」の前に「.c」を挿入したいのですが、何か良い方法はありませんでしょうか。 よろしくお願いいたします。 置換前: FALSE /abcdef/ FALSE 1451919600 abcdef %8B%A6-%95%97-%95a-%8D%91-%92%B2-%8A%F8-%96%9C-%89%B0-%90%AB-%89%B0%95a%95%97-%8B%A6%92%B2%90%AB-%96%9C%8D%91%8A%F8-4be8672275e58bc12b941d73fa5365a22b820d825cee506f0598338d65b16717-20160104 置換後: FALSE /abcdef/ FALSE 1451919600 abcdef %8B%A6.c-%95%97.c-%95a.c-%8D%91.c-%92%B2.c-%8A%F8.c-%96%9C.c-%89%B0.c-%90%AB.c-%89%B0%95a%95%97.c-%8B%A6%92%B2%90%AB.c-%96%9C%8D%91%8A%F8.c-4be8672275e58bc12b941d73fa5365a22b820d825cee506f0598338d65b16717-20160104

  • perlでの、ファイル読み込みについて

    perlでの、ファイル読み込みについてお尋ねしたいことがあります。 a b c d e f g h i というような内容のテキストファイルがあったとき、この成分を「○行×列」の個別に読み込みたいのですが、 (C言語でいう、「A[0][0]=a A[0」[1]=b A[0][2]=c A[1][0]=d ・・・のように) どのようにしたらよいのでしょうか? perlに関しては全くの初心者なのですが、どうしてもperlを使わないといけない事情があり、 稚拙な質問かとは思いますが、どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • 行を超えて範囲指定したい。

    エクセル2000でA1:G1とするとA1-A6,B1-B6,C1-C6,D1-D6,E1-E6,F1-F6,G1-G6が範囲指定できます。 行を超えて A1-A6,D1-D6,G1-G6,J1-J6というように3行おきに範囲指定する方法を教えてください。

  • Excelで複数行を1行にするマクロについて

    Excel2000で3行を繰り返し、1つの行にまとめていくマクロの書き方についてご教授ください。 例えば下記のような並びの時、 A B C D E F G H I ..... マクロを使って、 A B C D E F G H I ...... のようにしたいと考えています。

  • 秀丸エディタで、行の後ろに倍数の連番を挿入したい

    行の後ろに3の倍数を挿入する場合、 a b c d e f のような行を a3 b6 c9 d12 e15 f18 のように3の倍数を後ろに挿入したいです。 置換または、マクロを使ってこのようなことは可能でしょうか?

  • エクセル、任意の「行」だけを抽出したい。

    こんなことできますか? A1:F100のセル内にランダムに数字が入っています。 質問1) この中から 1行目→3行目→5行目と一つ飛ばしで入っているデータを抽出してH1:M100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 A1-B1-C1-D1-E1-F1 A2-B2-C2-D2-E2-F2 A3-B3-C3-D3-E3-F3 A4-B4-C4-D4-E4-F4 A5-B5-C5-D5-E5-F5 A6-B6-C6-D6-E6-F6 A7-B7-C7-D7-E7-F7 ・・・ A100-B100-C100-D100-E100-F100 の中から A1-B1-C1-D1-E1-F1 A3-B3-C3-D3-E3-F3 A5-B5-C5-D5-E5-F5 ・・・ を抽出して H1-I1-J1-K1-L1-M1 ・・・ H100-I100-J100-K100-L100-M100 の範囲内に表示させたいです。 質問2) 同様に、 1行目→4行目→7行目と二つ飛ばしで入っているデータを抽出してO1:T100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 ※ 説明がわかりにくいかもしれませんが、よろしくお願いします。

  • 行・列の整理! perl

    perlでデータを並び替えて整理したいです。 【元データ】 A a b A c d A e f A g h B i j B k l B m n C o p C q r C s t C u v ・ ・ ・ 上記のデータを下記のように並び替えしたいのですが上手くできずに困っています。 どのような記述をすれば良いのでしょうか。間の空白はタブ区切りです。 【目標】 A a b c d e f g h B i j k l m n C o p q r s t u v D ・ 現在、元データから A B C D ・ ・ というデータを作り、元データと比較していますが上手くいきません。 for($i=0; $i<@key; $i++){ print OUT "$key[$i]"; for($j=0; $j<@data; $j++){ if($key[$i] =~ /$data[$j]/){    #部分一致 print OUT "$'"; } } print OUT "\n"; } 部分一致の行を正規表現を用いて上手く処理したいのですがやり方がわからず躓いています。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • Excelで、行の組み換えについて

    A列からG列までデータが入っているリストがあるのですが、 例えば、1行目から50行目までと、51行目から100行目までを交互に組み入れるには どのようにすればよいでしょうか。   A B C D E F G 1 2 3 ・ ・ ・ 51 52 53 ・ ・ ・ といったものを、   A B C D E F G 1 51 2 52 3 53 ・ ・ ・ のようにしたいのですが、一気に操作できる方法があれば 教えていただきたく、よろしくお願いいたします。

  • perlでアドバイスをお願いします。

    あるテキストファイルが以下の内容で記述されているとします。 a   file1 a   file1 a   file1 b   file1 b   file1 b   file1 c   file2 c   file2 d   file2 d   file2 e   file2 e   file2 f   file3 f   file3 f   file3 上記のように列が二つあるテキストファイルについて、 2列目のfile名が1列目のどの値とひもづいて いるかを処理するperlプログラムを作ることを考えます。 出来上がったperlによって上記テキストファイルを処理した結果は、 file1は aとb file2は cとdとe file3は f とひもづいていることが分かる ということにしたいです。 これをperlプログラムで書くとき、条件として 一行一行を読みとるとき if ( $_ =~ /(\S+)\s+(\S+)/ ){ を使っています。 そのため$1と$2に現在行の1列目,2列目が与えられた後、 ハッシュと配列を組み合わせて考えた場合どのようにすれば いいのでしょうか。 また仮にテキストファイルの続きが存在し、 1列目がg 、2列目がfile1 の行があるとき 2列目で既に出てきた同じfile名はエラーとすることも考えた 場合どう記述するのか合わせてお願い致します。 長くなってしまい申し訳ないのですが、 ご指導ご鞭撻宜しくお願い致します。

  • 行を分解して配列に入れるには

    プログラミング初心者です。 環境はWindows XP SP2 Visual C++6.0,MFC,SDIです。 上の環境下でファイル読み込み関数を作っているのですが、 MFCのファイルダイアログ(コモンダイアログ)を呼び出した後ReadStringで一行読み込んだ行 abcde 18 abc 23 54 23 43 を再度sscanfで読み込んで a = "abede" b = 18 c = "abc" d = 23 e = 54 f = 23 g = 43 と配列に入れなおしたのですがa = "a"と始めの一文字しか配列に入りません。空白で区切る方法など、いい方法がありましたら教えてください。 よろしくお願いします。