- 締切済み
perlで指定範囲を複数ファイルに分割する方法は?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kumoz
- ベストアンサー率64% (120/185)
エラーの理由を感違いしていました。以下、訂正します。 (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)
<DATA> の後ろの閉じ括弧を忘れました。すみません。 use strict; my @content; while (<DATA>) { .....
- kumoz
- ベストアンサー率64% (120/185)
プログラムの冒頭を次のように変更すると、エラーが解消すると思います。 use strict; my @content; while (<DATA> { .....
- kumoz
- ベストアンサー率64% (120/185)
スカラーコンテキストの範囲演算子を使うのが、一番簡単かと思います。次のプログラムでは、ファイル名も中身も画面に表示するようになっています。コメントアウトしてある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
関連する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; }
- ベストアンサー
- C・C++・C#
- 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 といった具合です。 これらの作業をどのようにプログラミングすれば良いのかわかりません。 情けない質問ですが、ご教授お願いします。
- ベストアンサー
- Visual Basic
- アクセスログから同時ログイン数を割り出す手法
以下のようにアクセスログが出力されるものがあります。 このログより、ユーザがログインした時点で他に何ユーザログイン しているかを集計する方法を模索しています。 何か良い方法ありますでしょうか。 *************************** 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 *************************************** 以上です
- 締切済み
- その他(ITシステム運用・管理)
- 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に表示する。 --------------------------- この関数を教えて頂けませんでしょうか? 宜しくお願い致します。
- 締切済み
- その他MS Office製品
- (バッチ処理) リストファイル取得と実行
お世話になります --ここから-- 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文をどのように書いたらいいですか。ご教授,お願い致します。
- 締切済み
- オフィス系ソフト
補足
ご回答ありがとうございます。 初心者で(/start/ .. /end/)の使い方がわからず悩んでました。 line9/10で下記のエラーが出てきたのですが、$contentの初期化をしても解消できませんでした。 Use of uninitialized value $content[0] in concatenation (.) or string at split.pl.... すみませんがよろしくお願いいたします。