プロが教えるわが家の防犯対策術!

Perlのテキスト処理に関する質問です.やりたいことはあるディレクトリ内に10000個ほどの(1)のようなテキストデータがあります.ここで私は(2)のプログラムを作成しました.しかしながら,このプログラムだと10000個あるテキストデータの一つしか処理できません.この処理内容をディレクトリ全体に適用させる方法はありますでしょうか?File::Find::Ruleなどがネット上にあったので使おうと努力しましたができませんでした.どなたかよろしくお願いします.


(1) 
2020 01 01 00 109.18970 18.36816 -2.317 -2.459 292.712 0.013 91.276 30.618 292.712 0.013 -2.317 -2.459 998.793 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
2020 01 01 00 109.54297 18.39178 -2.702 -2.652 292.653 0.013 90.044 30.676  292.653 0.013 -2.702 -2.652 993.902 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000





(2)
use warnings;

open INFILE, '<', '2020-01-01_00.txt' or die "file open error: $!";
while( <INFILE> ){
chomp if( /\n$/ );
$Year = substr($_,0,4);
chomp if( /\n$/ );
$Month = substr($_,5,2);
chomp if( /\n$/ );
$Day = substr($_,8,2);
chomp if( /\n$/ );
$Time = substr($_,11,2);
chomp if( /\n$/ );
$Lon = substr($_,16,9);
chomp if( /\n$/ );
$Lat = substr($_,29,8);
chomp if( /\n$/ );
$Temp = substr($_,57,7);
chomp if( /\n$/ );
$Hum = substr($_,76,6);
chomp if( /\n$/ );
$Ozone = substr($_,85,6);
chomp if( /\n$/ );
$Rad = substr($_,140,5);

$data = $Year. "-".$Month."-".$Day." ".$Time." ".$Lon." ".$Lat." ".$Ozone." ".$Rad." ".$Hum." ".$Temp."\n";

open($data, ">", "data.txt") or die("error :$!");

}

# ファイルを閉じる
close INFILE;
exit;

 

A 回答 (5件)

> このプログラムだと10000個あるテキストデータの一つしか処理できません.



確認です。
MAC(またはMACで作ったテキストファイル)でやってるんですか。
1個のファイルは意図したように処理できて、そのように10000個のファイルを連続処理したい。ということですか。

この回答への補足

okmotokun様

コメントありがとうございます.

もう何日も挑戦していますが,一向に進みません.環境はWindows XP でActivePerlを用いています.

なんとかほかの方法でできないかとVMwareでUbuntuをエミュレートし試行錯誤していますが,shとawkで以下のようなスクリプトを作ってみました.

#!/bin/sh

for i in ????-??-??_??.txt
do
cat $i | awk '{print $1"-"$2"-"$3,$4,$5,$6,$12,$18,$11,$13}'
done

しかしながら,この方法だと処理内容を個別のファイルとして保存できません.

Perlもしくはshでもよろしいので,解決方法をお教えいただけないでしょうか?

大変厚かましい要望ですが是非ともよろしくお願い申し上げます.

補足日時:2008/06/29 09:24
    • good
    • 0
この回答へのお礼

なんとか自己解決できました.ソースは以下です.

#!/bin/sh

for i in ????-??-??_??.txt
do
cat $i | awk '{print $1"-"$2"-"$3,$4,$5,$6,$12,$18,$11,$13}' >> ./out/$i
done

皆様,コメントありがとうございました.結局Perlではなくshでできました.

お礼日時:2008/06/29 09:49

本筋とはまるで関係ないところだけど、substr 連発で切り出してるヤツ、


unpack一行で取ったほうがすっきりすると思います。

というかスペースでsplit 一発?
    • good
    • 0
この回答へのお礼

ありがとうございました。解決できました。

お礼日時:2008/06/29 17:26

あ~, open の行は間違ってますね. すみません. 適当にコンマを入れてください.


ただ, 「どうもうまくいきません」と言われても, 何がどう「うまくいかない」のかわからないんですけど. とりあえず $filename にファイル名が入っていることは確認できますか?
    • good
    • 0
この回答へのお礼

ありがとうございました。解決できました。

お礼日時:2008/06/29 17:26

サブディレクトリを無視してよいのなら下記が簡単かと思います。



while(<*.txt>){
print "$_\n";
}

この回答への補足

shippo_ppk様

ご回答ありがとうございました。ぜひ明日やってみます。

補足日時:2008/06/26 23:18
    • good
    • 0

単純に * を glob してファイル名のリストを作っちゃうとか, opendir+readdir+closedir とか.


前者でいけば
for my $filename (glob '*') {
open INFILE '<' $filename or die ....
処理
}
と思う. ところで, chomp if /\n$/; って全く意味ないし, chomp を同じオペランドに対して複数回やっても無意味です. chomp の機能は理解できてますか?

この回答への補足

Tacosan様

ご回答ありがとうございました.3時間ほど粘ってみたのですが,どうもうまくいきません.教えて君になってしまい大変恐縮ですが,ぜんソースを教えていただけないでしょうか.よろしくお願いします.chompの内容はだいたい理解できました.

補足日時:2008/06/26 19:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!