• ベストアンサー

複数行にわたる処理

こんばんは。perl初心者です。 どうしてもわからないので、どうかアドバイスよろしくお願いします。 一つのファイルに、以下のような3行で一組の塊がある場合、 <line_a>: aaaaaa <line_b>: BBBBBB <line_c>: cccccc <line_a>: aaaaaa <line_b>: bbbbbb <line_c>: cccccc ... <line_b>の行に文字列"BBBBBB"が含まれていたら、<line_a>の内容を"aaaaaa"から"AAAAAA"に置換してファイルを上書きしたいのですが、 どうやったらいいのでしょうか・・・。

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

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

  • ベストアンサー
  • ken-etsu
  • ベストアンサー率46% (55/119)
回答No.4

んー、もう少し条件を整理して考え直してはいかがですか? <line_a>以降、次の<line_a>直前の行までを一ブロックとして考えて、 一行づつ読んで、<line_a>が出てくる度にその直前のブロックまとめてを出力する、 と言うように書いてみるとか。 読んでいるブロックは、配列に入れておく必要がありそうですね。 置換するのは、その配列の最初の要素です。 ただし、この場合は、最初と最後のブロックの処理をよく考えてください。

pa_baraban
質問者

お礼

とりあえず、望みのものを出力することができました。 もう少し考えを整理する必要がありそうですが、一旦ここで質問を締め切ります。 アドバイスありがとうございました!

その他の回答 (4)

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.5

こんちには ファイル全体を連結して文字列をつくり 置換してはどうでしょう local($/) = undef; $line = <IN>; で <line_a>: aaaaaa\n<line_b>: BBBBBB\n ↓ <line_a>: AAAAAA\n<line_b>: BBBBBB\n と置換する

pa_baraban
質問者

お礼

こんばんは。 そういう手もあるのですね。 今回はとりあえず望みのものが得られたので、次に試してみます。 アドバイスありがとうございました! この場を借りて投稿してくださった皆様にお礼申し上げます。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

> <line_a>: aaaaaa > <line_b>: BBBBBB > <line_c>: cccccc > > <line_a>: aaaaaa > <line_b>: bbbbbb > <line_c>: cccccc line_c のあとに必ず空行が来たりします? もしそうなら、 $/ = "\n\n"; while (<>) { ... } とか。

pa_baraban
質問者

補足

>line_c のあとに必ず空行が来たりします? 空行ではない場合もあります。 なので、No.2さんへの補足欄に書いたようにしてみたのですが、 うまくいきません。 あつかましいお願いかもしれませんが、ダメ出ししていただけるとありがたいです。

noname#58606
noname#58606
回答No.2

微妙に、Perlを忘れているのですが、概念だけ。 「3行ずつ読め!」って、命令はありません。 1行を3回読むことで、一区切りにするとか。 forループで3回読むのを一区切りとすれいいですし。 また、1行ずつに何か必ず特長があるのなら、それを検索して、読む出して、配列に入れるなり、変数に入れるなり。 けっこう条件が曖昧です。 もうちょっと具体的なソースやデータがないと。 この3行ってのは、データとして鉄板なんですよね? 普通は、無理にでも1行にまとめたり、別のファイルに分けたりするんですが。 ><line_b>の行に文字列"BBBBBB"が含まれていたら、<line_a>の内容を"aaaaaa"から"AAAAAA"に置換してファイルを上書きしたいのですが、 そもそも、これだけなら、 ファイルを上から読んでいって、 if ('<line_b>' == 'BBBBBBB'){  一つ上のラインを一度消して、修正すればOK。} else{スルー。} 現在地がxなら、(x-1)の一を削除して、(x-1)に追加。 ・・・、無理があるかな。 まぁ、概念はこんなのもあります。

pa_baraban
質問者

補足

>この3行ってのは、データとして鉄板なんですよね? この3行以外のものが含まれていることもあります。 なので、 last を使って、一つ目の<line_a>から二つ目の<line_a>までの間にある行を取り出して・・・というような、以下のようなスクリプトを書いてみたのですが、 while (<>) {   last if /^<line_a>/;   print; } while (/^<line_a>/) {   $a = $_;   while (<>) {     last if /^<line_a>/;     if (/BBBBBB/) {       $a =~ s/aaaaaa/AAAAAA/; #      print $a;       print;     }     else {       print;     }   } #      print $a; } $a のprint位置がわかりません・・・ if (/BBBBBB/) { } 中でprintすると変な位置に挿入されるし、 while (<>) { }を抜けた後にすると一個後ろの組にずれてしまいます。 そもそもこのような書き方は間違っているのでしょうか? > 一つ上のラインを一度消して、修正すればOK。} この処理をするにはどういう記述をしたらいいのでしょうか? ダメ出ししていただけるとありがたいです。

  • ken-etsu
  • ベストアンサー率46% (55/119)
回答No.1

んー、自分の説明の通りのことをプログラムで書けばいいんじゃないでしょうか。 三行づつ読んで、<line_b>を調べて、条件に合致すれば、<line_a>を変更して、<line_a>、<line_b>および<line_c>を出力する。それだけでしょ? その中の何が解らないんですか?

pa_baraban
質問者

補足

三行づつ読むのがわかりません・・・

関連するQ&A

  • エクセル/行選択の仕方を教えてください。

    はじめまして。 エクセルで、3行ごとに選択し、選んだ情報を列に移す作業をしたいのですが 1800行あり手で選択するのが大変です。 行いたい作業は以下の通りです。 A列 AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC AAAAAA ↓ A列 B列 C列 AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC 一行一行選択して列に移すのではなく選択できる方法がありましたら 是非ご教授ください。 よろしくお願いいたします。

  • Excelで複数行の置き換えを行いたい

    Excelで複数行の置き換えを行いたいと考えています。 例えば、Excelのシートの中身が aaaaaa bbbbbb cccccc bbbbbb aaaaaa bbbbbb であったとします。このとき、 aaaaaa bbbbbb を zzzzzz vvvvvv に置き換えて、 zzzzzz vvvvvv cccccc bbbbbb zzzzzz vvvvvv というようにしたいです。 なにか良い方法はないでしょうか?

  • perlプログラム 外部複数ファイルの読み込み処理について

    perlプログラム 外部複数ファイルの読み込み処理について あるフォルダに T0001_05_01,T0001_05_02,T0001_05_03,…,T0001_05_31 という31個のファイルがあります。 それぞれのファイルは 下記のような 形式で記述されております。 (例 T0001_05_01のファイルの中身) 2010-05-01 00:00:00.000 N00001 AAAAAA 2010-05-01 00:00:00.108 N00018 BBBBBB 2010-05-01 00:00:10.305 N00002 AAAAAA 2010-05-01 01:00:10.966 N00008 CCCCCC … また、別のlist.txtに 下記のようなユニークなリストが入っております。 AAAAAA CCCCCC WWWWWW … このとき、list.txtの値が それぞれT0001_05_XXファイルの何行目に出力されているか 出力するperlプログラムを作成したい。 (出力結果イメージ:1ファイル化) T0001_05_01 1行目 2010-05-01 00:00:00.000 N00001 AAAAAA T0001_05_01 3行目 2010-05-01 00:00:10.305 N00002 AAAAAA … T0001_05_31 10行目 2010-05-31 03:00:00.999 N00400 AAAAAA T0001_05_01 4行目 2010-05-01 00:00:00.000 N00008 CCCCCC … perlプログラム知識がないものなので、このようなファイルの出力の仕方がわかりません。 教えていただけると助かります。

    • ベストアンサー
    • Perl
  • エクセルのデータを一部抽出する方法をお教えください

    こんにちは。宜しくお願い致します。 エクセルのA列に以下の番号が入っています。  A  ――――――― 1|AAAAAA-01 2|AAAAAA-02 3|AAAAAA-03 4|BBBBBB-01 5|BBBBBB-02 6|BBBBBB-03 7|CCCCCC-01 8|CCCCCC-02 9|CCCCCC-03 10|・ 11|・ 12|・ 同じ番号にそれぞれ「-01」「-02」「-03」がついてしまっています。 この情報で、「-01」のみの行を抽出したいのですが、難しく考えてしまったせいか、上手く行きません。 エクセルにお詳しい方、方法を教えて下さい。 宜しくお願い致します。

  • perl シングルコーテーションを含んだ文字編集

    active perl(アクティブパール)で 以下の文字列編集を行いたいのですが、 シングルコーテーションの編集で上手く出来ずに困っています。 どなたか経験豊富な方、良いコーディング方法があれば ご教授下さい。 やりたい事としては、 文字列 aaaaaa bbbbbb cccccc dddddd といった内容を 取り込んで 'aaaaaa','bbbbbb','cccccc','dddddd' といった文字列の出力を行います。 上記の例では文字はddddddまでですが、 場合により bbbbbbまでたったりといった感じで 変換前の文字の行数は可変で、2行でも3行でも4行でも、 各行の文字をシングルコートで囲って、カンマでつなげた文字列を出力します。 上記の仕様内容で、こうすれば出来る! といったサンプルコードを教えていただけると助かります。

  • EXCLEのマクロ データの絞り込み

    EXCELのマクロについてご教授願います。 数百件のデータで、C列は同じデータは複数あるが、A列に関して別のデータが入っている。B列もほぼ同じデータ ここで条件として C列が同じデータで、A列に特定のワードが入っているデータだけを残し、他のデータを削除するというマクロを組むことは可能でしょうか。 例えば下記のようなデータで、「abcd」だけ残し 他のデータは削除する    A         B        C 1  abcd      AAAAAA      BBBBBB 2  EFGA      AAAAAA      BBBBBB 3  hijk      AAAAAA      BBBBBB 4  lnms      AAAAAA      BBBBBB 5  abGG      PPPPPP      WWWWWW 6  EFTT      PPPPPP      WWWWWW 7  POII      PPPPPP      WWWWWW 2行目から4行目と6行目委から7行目を削除し以下のような データにする。常にA列のデータに ab というキーワードが 入っていて、Cが同じデータは、abが入っているデータのみ 残し他を削除する    A         B        C 1  abcd      AAAAAA      BBBBBB 5  abGG      PPPPPP      WWWWWW のみにする

  • エクセルの質問

    例えばメモ帳に、 aaaaaa,,111111,,222222 bbbbbb,,333333,,444444 あるとして、これを2行まとめてコピーしてエクセルに貼り付けると、 A1にaaaaaa,,111111,,222222 A2にbbbbbb,,333333,,444444 と入ってしまいます。 これを、 A1にaaaaaaB1に,,C1に111111D1に,,E1に222222 A2にbbbbbbB2に,,C2に333333D2に,,E2に444444 と貼り付けられる何か良い方法はありませんでしょうか? なぜ行はA1、A2とセルを分けて入るのに列は分かれてくれないのでしょうか? 分かる方是非教えてください。

  • エクセルのオートフィルターにつきまして

    エクセルのことでお聞きしたいことがあります。 下のような、AAAやDDDについての説明がとなりの列に複数行表示されているようなデータを作りました。 AAA aaaaaa     bbbbbb     cccccc DDD dddddd     eeeeee     ffffff そこで、AAAやDDDが書いてある列からAAAだけを選択できるようにして、 AAA aaaaaa     bbbbbb     cccccc のように、AAAの説明のみが表示されるようにしたいのですが、オートフィルターを使ってもうまくいきませんでした。 どなたか、良い方法をご存知でしたら、教えてください。お願い致します。

  • メモ帳Plusの機能について

    メモ帳Plusを使っているのですが行の頭に1 2 3と番号を振る 機能はないのでしょうか? 1 aaaaaa 2 bbbbbb 3 cccccc こんな感じです。100行以上あるので手動だと かなりきついです。 よろしくお願いします。

  • 複数項目を他の行と比較して、判定を行いたい(Excel)

    複数項目を他の行と比較して、判定を行いたい(Excel) ご覧いただきまして、ありがとうございます。 タイトルにありますように、複数の項目を他の行のデータと比較して、全ての条件を満たした場合にそれを表示させたいと考えています。 例えば、   A    B   C    D  E 1 出場  回数  年齢  得点 2 A組   4   24   570 3 B組   4   21   480 4 A組   4   25   400 5 A組   3   29   470 このようなデータがあるとしてください。 それぞれの行を他の行と比べて、  出場組が同じ  回数が同じ  年齢がより若い  得点が50点以上高い という条件を満たしたら、E列に数値を表示させたいと考え、  {=(A1=A$1:A$5)*(B1<B$1:B$5)*(C1=C$1:C$5)*(D1>=D$1:D$5+50)} というような式をE列に入れました。 イメージとしては、   A    B   C    D   E 1 出場  回数  年齢  得点 2 A組   4   24   470  1 ←2行後に対して条件を満たす 3 B組   4   21   380  0 4 A組   4   25   300  0 5 A組   3   29   370  0 となってほしいのですが、実際は、   A    B   C    D   E 1 出場  回数  年齢  得点 2 A組   4   24   470  0 3 B組   4   21   380  0 4 A組   4   25   300  0 5 A組   3   29   370  0 となり、思ったような結果になりませんでした。 どのような式を入力すればよいかお分かりの方がいらっしゃいましたら、ご教示ください。よろしくお願いいたします。

専門家に質問してみよう