• 締切済み

perlで指定範囲を複数ファイルに分割する方法は?

お世話になります。 perlを使用して、 下記の元ファイル[infile.txt]よりstart~endの範囲を各テキストファイルに 分割出力する方法をご教授いただけないでしょうか。  ※出力ファイル名は元のファイル名 (infile) + 1行目の文字列(単語)にします。   例>>infile_1111.txt , infile_333.txt よろしくお願いいたします。 [infile.txt] aaaa bbbb start 1111 2222 end dddd eeee start 3333 4444 end

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

みんなの回答

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

エラーの理由を感違いしていました。以下、訂正します。 (1) start end (2) start 1111end start2222 end 実際の処理対象に上記 (1) のような中身のないブロックがある、(2) のような中身の行に start または end 含まれている、ということが考えられます。 (1) の場合は書き出す行がないので無視し、(2) の場合は正常に処理されるようにプログラムを修正してみました。 use strict; my @content; while (<DATA>) { if (/^start$/ .. /^end$/) { chomp; push @content, $_ if !/^start$/ and !/^end$/; if (/^end$/ and @content) { print "infile_$content[0].txt\n", join("\n", @content), "\n\n"; # open OUT, ">infile_$content[0].txt" or die "Can't open: $!"; # print OUT join("\n", @content), "\n"; # close OUT; @content = (); } } } __DATA__ aaaa start end bbbb start 1111end start2222 end dddd eeee start 3333 4444 end

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

<DATA> の後ろの閉じ括弧を忘れました。すみません。 use strict; my @content; while (<DATA>) { .....

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

プログラムの冒頭を次のように変更すると、エラーが解消すると思います。 use strict; my @content; while (<DATA> { .....

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

スカラーコンテキストの範囲演算子を使うのが、一番簡単かと思います。次のプログラムでは、ファイル名も中身も画面に表示するようになっています。コメントアウトしてある3行を生かすと、ファイルにも書き出すようになります。 while (<DATA>) { if (/start/ .. /end/) { chomp; push @content, $_ if !/start/ and !/end/; if (/end/) { print "infile_$content[0].txt\n", join("\n", @content), "\n\n"; # open OUT, ">infile_$content[0].txt" or die "Can't open: $!"; # print OUT join("\n", @content), "\n"; # close OUT; @content = (); } } } __DATA__ aaaa bbbb start 1111 2222 end dddd eeee start 3333 4444 end

yontans
質問者

補足

ご回答ありがとうございます。 初心者で(/start/ .. /end/)の使い方がわからず悩んでました。 line9/10で下記のエラーが出てきたのですが、$contentの初期化をしても解消できませんでした。 Use of uninitialized value $content[0] in concatenation (.) or string at split.pl.... すみませんがよろしくお願いいたします。

関連するQ&A

  • 指定の行をループさせてファイルに出力

    C言語で"input.txt"内の文の行範囲と 繰り返す回数をキーボードから入力することにより 結果を"output.txt"に出力するプログラムを考えているのですが、うまくできません。 具体例を以下に示しておきます。 ----input.txt---- aaaa bbbb cccc dddd eeee ------------------ キーボードから繰り返す範囲、2行目と4行目を指定。 繰り返す回数を2回に指定。 ----output.txt---- aaaa bbbb cccc dddd bbbb cccc dddd eeee ------------------- と、こんな感じにしたいです。 指定した行範囲を"output.txt"に出力することはできたのですが 繰り返しの部分がうまくできません。 どなたかご教授お願いします。 自分が作ったプログラムを下に載せておきます。 これをベースに作れたらいいのですが・・・ #include<stdio.h> #include<stdlib.h> #define STR_MAX 256 int main (void) { FILE *fpin, *fpout; char buff[STR_MAX]; int line = 1; int start; int end; printf("start >>"); scanf("%d",&start); printf("end >>"); scanf("%d",&end); if((fpin = fopen("input.txt","r")) == NULL) { printf("infile can't open\n"); exit(EXIT_FAILURE); } if((fpout = fopen("output.txt","w")) == NULL) { printf("outfile can't open\n"); exit(EXIT_FAILURE); } while(fgets(buff,STR_MAX,fpin) != NULL) { if((line >= start)&&(line <= end)) { fputs(buff,fpout); } line = line + 1; } fclose(fpout); fclose(fpin); return EXIT_SUCCESS; }

  • UNIXで文字列分割

    UNIXでマルチバイトの文字列で分割したいです。 例) aaaa bbbb cccc dddd eeee ffff ↓ [bbbb]で分割 [1]aaaa [2] cccc dddd eeee ffff できればawkで処理をしたいと考えています。

  • SQLの書き方について教えてください。

    accessについて。 シートの中に列名name、列名friendnameがあります。 name,friendname aaaa,bbbb bbbb,cccc cccc,aaaa dddd,aaaa eeee,bbbb ffff,eeee ほしいデータは aaaa,bbbb,cccc bbbb,cccc,aaaa cccc,aaaa,bbbb dddd,aaaa,bbbb eeee,bbbb,cccc ffff,eeee,bbbb と友達の友達の名前がほしいのです。 SQLの書き方を教えてください。 よろしくお願いします。

  • VBAでパスを取得した後、分割して取り扱いたい

    VBAでパスを取得するとします。 例えば、 A:\BBBB\CCCC\DDDD\EEEE.TXT この時パスを次のように分割をしようとしています。 PATH1=A:\BBBB\CCCC\DDDD\ PATH2=EEEE.TXT といった具合です。 これらの作業をどのようにプログラミングすれば良いのかわかりません。 情けない質問ですが、ご教授お願いします。

  • アクセスログから同時ログイン数を割り出す手法

    以下のようにアクセスログが出力されるものがあります。 このログより、ユーザがログインした時点で他に何ユーザログイン しているかを集計する方法を模索しています。 何か良い方法ありますでしょうか。 *************************** user,login,logout aaaa,095703775,100825968 bbbb,095709415,095809695 cccc,095732774,095733633 bbbb,095734883,095735227 aaaa,095735321,095735727 dddd,095742555,095743680 eeee,095742664,095743102 gggg,095743196,095743664 tttt,095801070,095804070 *************************** ・userはログインしたユーザ名、login、logoutはHHMMSSmmm形式で時刻を出力します。 ・各ユーザはloginからlogoutまでの間ログインした状態です。 出力結果としては以下のようなイメージです。 *************************************** user,login,logout,実行ユーザ数 aaaa,095703775,100825968,0 bbbb,095709415,095809695,1 cccc,095732774,095733633,2 bbbb,095734883,095735227,2 aaaa,095735321,095735727,3 dddd,095742555,095743680,2 eeee,095742664,095743102,3 gggg,095743196,095743664,3 tttt,095801070,095804070,2 *************************************** 以上です

  • SQLでの集計

    下記の様に、「複数のitemを買っているuserと購入されたitem」のテーブルと、 user item ---------------------------------- 田中 AAAA 田中 CCCC 田中 EEEE 北野 DDDD 北野 BBBB 北野 AAAA 小堺 CCCC 小堺 EEEE 松本 EEEE 松本 KKKK 松本 CCCC 松本 DDDD 浜田 BBBB 浜田 DDDD 下記の様な IDに紐付いた 「item」のテーブルから、 ID  item ---------------------------------- 1   AAAA 2   BBBB 3   CCCC 4   DDDD 5   EEEE 下記の様に各itemと各itemを買った場合に一緒に買われるitemの一覧を結果 として表示させたいのですが、クエリの作り方が思い浮かばず、困っています。 ※)可能であれば、買われたitemを表示する際にはbuy1から(左側から)同時購入 回数の多いitemを重複せずに並べて表示したい ID  item  buy1  buy3  buy4  buy5  buy6・・・・ ---------------------------------- 1  AAAA CCCC BBBB DDDD EEEE 2  BBBB DDDD AAAA 3  CCCC AAAA EEEE DDDD KKKKK 4  DDDD AAAA BBBB CCCC EEEE 5  EEEE AAAA CCCC KKKKK 尚、IDと紐付いているitem数は決まっていますが、買われるitemの種類は上記 の様にIDが1~5だけではなく、集計してみないと判らない状況です。 今の所、SQLはACCESS(2003)上にて手打ちしています。 以上、ご教示のほど、宜しくお願い致します。

  • URL構造変更 シンボリックリンクについて

    PHPで作られた非常に長い階層の動的なシステムを持っています。 例:http://www.●●●.com/aaaa/bbbb/ccc/dddd/eeee/1 1が個別ページを指定するものです。 設計ミスで aaaa/bbbb/ccc/dddd/eeeeは、いらないので短縮させたいのですが、 シンボリックリンクとかでここを消すことはできますでしょうか? cd /home/hogeuser/www/ ln -s /home/hogeuser/www/aaaa/bbbb/ccc/dddd/eeee/ と、したいのですが、 実際WEBサーバをみとaaaaやbbbbのフォルダがありません。 動的に識別子としてつけているようです。 システム自体の改修がかなり大掛かりになるので こういった際に階層を浅くする楽なやり方はありますでしょうか?

    • 締切済み
    • PHP
  • エクセルについての質問。

    エクセルの関数に関して質問があります。 |10001|AAAA|10002|BBBB| |10002|BBBB|10004|DDDD| |10003|CCCC|10004|DDDD| |10004|DDDD|10001|AAAA| |10005|EEEE|10005|EEEE| ちょっと分かりにくいですが 一番上の行ですと、 列A=10001 列B=AAAA 列C=10002 列D=BBBB と考えて下さい。 質問です。 --------------------------- 列Cの数値を列Aから検索して 同じのがあれば列Bの数値を列Dに表示する。 --------------------------- この関数を教えて頂けませんでしょうか? 宜しくお願い致します。

  • (バッチ処理) リストファイル取得と実行

    お世話になります --ここから-- cls @echo off set $aaaa=0 set $BBBB=0 echo AAAAを読む?(Yes:1 No:0) set /P $aaaa= ^>^> echo BBBBを読む?(Yes:1 No:0) set /P $bbbb= ^>^> if /i 0 EQU %$aaaa% goto next1 start /wait "AAAA BOT" "c:\prog\p.exe" -w AAAA :next1 if /i 0 EQU %$bbbb% goto next2 start /wait "BBBB BOT" "c:\prog\p.exe" -w BBBB :next2 end --ここまで-- 今までは、上記の追記・変更で対処できましたが、 数が多くなり対処しきれなくなってきたので リスト化したtxt(リストファイル.txt)を読み込み、 リストに載っている物を順次処理を行おうと考えております。 -リストファイル.txt- AAAA BBBB CCCC DDDD ---------------- ループさせたりして管理の簡素化を図りたいと思っています どのように記述を行えばよいか教えていただけませんでしょうか よろしくお願いいたします。

  • Access Union について

    下記2テーブルがあります。 テーブル1 品番   1月合計 AAAA   1111 BBBB   2222 CCCC   1122 EEEE   3211 テーブル2 品番   2月合計 AAAA   1211 BBBB   3222 CCCC   1522 DDDD   2223 UNIONのSQL文で下記のような結果を得たいです。 品番   1月合計  2月合計 AAAA   1111    1211 BBBB   2222    3222 CCCC   1122    1522 DDDD         2223 EEEE   3211 SQL文をどのように書いたらいいですか。ご教授,お願い致します。

専門家に質問してみよう