• 締切済み

Perlによるディレクトリ内の連続的な大量データ処理

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;  

みんなの回答

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.5

> このプログラムだと10000個あるテキストデータの一つしか処理できません. 確認です。 MAC(またはMACで作ったテキストファイル)でやってるんですか。 1個のファイルは意図したように処理できて、そのように10000個のファイルを連続処理したい。ということですか。

oswll
質問者

お礼

なんとか自己解決できました.ソースは以下です. #!/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でできました.

oswll
質問者

補足

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でもよろしいので,解決方法をお教えいただけないでしょうか? 大変厚かましい要望ですが是非ともよろしくお願い申し上げます.

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

本筋とはまるで関係ないところだけど、substr 連発で切り出してるヤツ、 unpack一行で取ったほうがすっきりすると思います。 というかスペースでsplit 一発?

oswll
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

あ~, open の行は間違ってますね. すみません. 適当にコンマを入れてください. ただ, 「どうもうまくいきません」と言われても, 何がどう「うまくいかない」のかわからないんですけど. とりあえず $filename にファイル名が入っていることは確認できますか?

oswll
質問者

お礼

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

回答No.2

サブディレクトリを無視してよいのなら下記が簡単かと思います。 while(<*.txt>){ print "$_\n"; }

oswll
質問者

補足

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

oswll
質問者

補足

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

関連するQ&A

専門家に質問してみよう