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プログラム知識がないものなので、このようなファイルの出力の仕方がわかりません。
教えていただけると助かります。
No.2ベストアンサー
- 回答日時:
サンプルプログラムを作成してみたので試してみてください。
テストしていないのでうまく行かないことがあるかも知れません。
use strict;
open FH, "list.txt" or die "Can't open list.txt: $!";
my @keyword = <FH>; chomp @keyword;
close FH;
my ($day, @result) = ('00');
while (++$day lt '32') {
my $file = "T0001_05_$day";
open FH, $file or die "Can't open $file: $!";
while (my $line = <FH>) {
foreach my $i (0 .. $#keyword) {
if ($line =~ /$keyword[$i]/) {
push @result, [$i, "$day", $., "$file ${.}行目 $line"];
last;
}
}
}
close FH;
}
@result = map { $_->[3] } sort { $a->[0] <=> $b->[0] || $a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] } @result;
open OUT, ">out.txt" or die "Can't open out.txt: $!";
print OUT @result;
close OUT;
No.3
- 回答日時:
まだ解決しませんか?
もしLinux なら grepの方が楽かも。(windowsでは不可です)
以下を データT0001_05~ファイルとlist.txtと同じ場所において
パーミションを705にして実行してください。
------------------------------------- ○○.cgi
#!/usr/bin/perl
$| = 1;
print "Content-type: text/html\n\n";
@files = glob("T0001_05_*");
open(IN,"list.txt");@keys=<IN>;close(IN); chomp @keys;
foreach(@keys){
print "<b>$_</b><br>\n";
@result = `grep -n "$_" @files`;
foreach(@result){
split(/:/,$_,3);
print "@_[0] @_[1]行目 @_[2]<br>\n";
}
print "<hr>\n";
}
exit;
--------------------------------------
htmlで出してます。適宜ブラウザ上でコピーしてください。
ボリュームが多く何百万行もあるため、grep実行はすでに試みたのですが、処理時間がかかってしまいました。プログラム初心者のため このプログラム内容は今後の参考にさせていただきます。ありがとうございます。
No.1
- 回答日時:
まず、それらのファイルが保存されているディレクトリを開く。
list.txtがあれば、それを開いてAAAAAなどのハッシュを作っておく。
ディレクトリにあるファイルの一覧を取得する。
それらを順番に開いて、そのファイルごとに一行ずつパターンマッチを行う。
AAA・・があれば、そのハッシュに、行数とその行のデータを配列で追加していく、
配列のハッシュを作成する。
最後に、書き込み用ファイルを開いて書き込む。
たとえば、
$hash{'AAAAAA'}=[(T0001_05_01,1,2010-05-01 00:00:00.000 N00001),
(T0001_05_01,3,2010-05-01 00:00:10.305 N00002)
]
とか、メモリーを消費するのでSEDなどストリームエディタを使うほうが早くて良いのだろうけど・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelマクロの差分抽出のコードを教えていただきたいです。 2 2023/03/14 11:40
- Visual Basic(VBA) Wordマクロで指定したフォルダ名に保存する方法について 8 2022/12/13 11:35
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) 3個のfileのセルデータを1個のfileのセルに貼り付けるVBAコードですが。 1 2023/02/20 09:21
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MATLABでカーブフィットしたデ...
-
ifstream/ofstream について
-
ファイルの一部を別のファイル...
-
VBAでCSVファイルを途中行まで...
-
openした後、closeしないでプロ...
-
VBAでCSVファイルの特定行を書...
-
エクセルVBA コードが同じでも...
-
awkスクリプトでダブルクォーテ...
-
バッチファイルの作り方(CSV→...
-
csvファイルの横方向への改行に...
-
ExcelをCSV書き出す場合のシー...
-
drtファイルはどうしたら開...
-
無料配布の郵便番号自動入力cgi...
-
ファイルからある文字列の個数...
-
close()で例外が投げられる理由
-
Perlで フォルダ内の全て...
-
Perl 特定のフォルダ以外削除
-
JSP URLに表示される拡張子 .jsp
-
csv出力
-
MATLABのm-fileについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名を複数個配列で確保...
-
Fortranで1行飛ばして読み込む方法
-
perlで指定範囲を複数ファイル...
-
Pythonでegrep機能をつかいたい
-
「パスが見つかりません」とい...
-
ifstream/ofstream について
-
ifstream を利用した1行分のテ...
-
C++でのテキストファイル読み込...
-
テキストファイルの各行を配列...
-
Perlのワンライナーをスクリプ...
-
perlプログラム 外部複数ファ...
-
Perl 重複カウント 上位3名
-
system関数と引数について
-
shellのコマンド deffの差分の...
-
Pythonで非日本語のUnicode文字...
-
perlで先頭の数値をみて昇順に...
-
while文がうまく動かない
-
Visual Basicを使って三平方の...
-
Perlによるディレクトリ内の連...
-
Perl Grepについて
おすすめ情報