初心者で至らぬ点が多々有りますが、宜しくお願いします。
環境はWindows7-64bit、ActivePerl 5.12.4 Build(64bit)を使用しています。
テキストが数百個有り、全て以下のような構成になっています。
文章1
文章2
文章3
kwd
文章4
kwd
文章5
文章6
kwd
~以下略~
ファイル郡をリストとして読み込み、それぞれのファイルに対して
kwdをキーとして検索し、該当した行の上の行を抽出しようとしています。
~ファイルリスト読み込みルーチンは省略、以下各ファイル毎のサブルーチン~
sub execute {
open(INP, "$inp"); #ファイル読み込み
open(OUT, ">rep\\$inp"); #ファイル書き出し(フォルダを変えて同名)
while(<IN>){
if($_ =~ m/kwd/){ #現在の行が"kwd"を含んでいたら
print OUT $prev; #前の行を抽出のつもり
}
$prev = $_; #現在の行データを$prevに格納
}
close(INP);
close(OUT);
}
$_には現在の行データが入っていると認識しており
上記の書き方で$prevには一段上の行データが入るのでは
と思ったのですが、現状$prevを出力してもカラです。
文法ミスよりも、そもそも考え方が間違っているような気がして
なりませんが、どうか解決法を教えて頂きたく。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
サブルーチンを呼び出す側を想定してみたのが、
以下のスクリプトですが、スクリプトと同一フォルダにある
"input.txt"を使った限りでは正常に実行できています。
$input = "input.txt";
execute($input);
sub execute {
my ($inp) = @_;
open(INP, "$inp"); #ファイル読み込み
open(OUT, ">rep\\$inp"); #ファイル書き出し(フォルダを変えて同名)
while(<INP>) {
if($_ =~ m/kwd/) { #現在の行が"kwd"を含んでいたら
print OUT $prev; #前の行を抽出のつもり
}
$prev = $_; #現在の行データを$prevに格納
}
close(INP);
close(OUT);
}
※サブルーチン側の問題でないとすると、サブルーチンの呼び出し側に問題があるのかもしれません。
「ファイル群をリストとして読み込み、」で、サブルーチンへのファイル名の引き渡しを
どのように行っているか、具体的に示していただけないでしょうか?
No.3
- 回答日時:
openがINPで、whileがINと コーディングミスしているだけの問題で
考え方は問題ないのでは。
この回答への補足
申し訳ありません。
ファイルハンドルに関しては投稿時の
推敲中に誤って消してしまったようです。
実際のファイルハンドルは同名です。
No.2
- 回答日時:
openでは、ファイルハンドルを"INP"としているのに、
入力するときは、"while(<IN>)"と異なったファイルハンドルに
しているので、入力データは何もないことになり、結果として
出力データ(ここでは$prev)には何も出てこないことになります。
したがって、"open(IN, "$inp"); #ファイル読み込み"とするか、
"while(<INP>)"と変更すれば、出力データも出力されます。
この回答への補足
申し訳ありません。
ファイルハンドルに関しては投稿時の
推敲中に誤って消してしまったようです。
実際のファイルハンドルは同名です。
No.1
- 回答日時:
「IN」というファイルハンドルは開けてないから, エラーになるかループが回らないかのどちらかのような気がするんだけど....
さておき, 「現状$prevを出力してもカラです」というのは
・どのように調べて
・どうなった結果
そう判断したのでしょうか?
この回答への補足
申し訳ありません。
ファイルハンドルに関しては投稿時の
推敲中に誤って消してしまったようです。
実際のファイルハンドルは同名です。
> >さておき, 「現状$prevを出力してもカラです」というのは~
に関してですが、出力したtxtの中身を見ての判断でしたが
正しくは「出力したtxtの中身は改行だけだった」です。
全く意味合いが違ってきますね・・・重ねて申し訳ありません。
なお改行数は、抽出元ファイル内部のkwd数と同数でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- その他(データベース) Excel VBA 転記について 1 2022/04/20 16:55
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ReadLineでの読み出し行を指定する
-
ExcelをCSV書き出す場合のシー...
-
Perlの変数に文字数制限(容量...
-
VBAで巨大なファイルの途中から...
-
VBAでCSVファイルを途中行まで...
-
エクセルマクロについて CSVフ...
-
Perl Vlookupみたいに
-
エクセルVBA コードが同じでも...
-
csvファイル改行コードの置換に...
-
複数のCSVを読み込み、一つにま...
-
他のサーバーにあるファイルの...
-
VBAでCSVファイルの特定行を書...
-
perlで、後ろの行を読んで、前...
-
ファイルとデータベースについて
-
cgiで表示するhtmlページ内でバ...
-
fopenでディレクトリ内の全ファ...
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
-
教えて!perlから.exeファイル...
-
MySQLに画像を格納してperlで取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
openした後、closeしないでプロ...
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
VBAで巨大なファイルの途中から...
-
ReadLineでの読み出し行を指定する
-
perlで、後ろの行を読んで、前...
-
JavaでCSVファイルを高速に読む...
-
MATLAB グローバル変数の宣言
-
perlにて2つのファイル比較
-
C言語でのファイルのデータ更...
-
拡張子 ”log” と ” dat” の違い
-
ADOによるCSVファイルからのデ...
-
VB6.0でDB接続する際に切断時の...
-
2つのCSVファイルをマッチング
-
Perlの変数に文字数制限(容量...
-
perlで容量の大きいCSVファイル...
-
データファイルをプロットする(...
-
Perl Vlookupみたいに
おすすめ情報