WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perl [ grep or sort ]

0:[投稿] 999 [2008/12/08 21:51 ] [環境:XP わかりません]

データ
code=001,date=2008/11/03,name=吉田
code=002,date=2008/10/15,name=川西
code=003,date=2008/06/25,name=園村
code=004,date=2008/07/09,name=松井

dateの有効期限は2ヶ月として・・・
(例えば001のデータだと2ヵ月後は2009/01/02、これ迄有効になる)

このデータの有効期限(2ヵ月後)が本日(2008/12/08)より以前のものを除去したいのですが(データでいうと003,004)、grepもしくはsort関数で「一発抽出!」出来ますでしょうか?

是非御教授を!


1:[関連] 999 [2008/12/09 10:00 ]

追加です。
code=001の2ヵ月後は2009/01/03でいいです。
(単純に月のみ2ヶ月プラスみたいな感じ)
その他やり方があれば教えて頂きたく思います。
(全データを検査する方法は分かるのですが・・一発?で検出出来ればと思っています。)


2:[回答] jam [2008/12/10 17:06 ]

全データを検査しないで一発ではできないです。
grepで記述をスマート?にならできるかもですが・・・
検査の方法は確立されているようなのでgrepで出来るか試してみたらいいのではないでしょうか。


3:[回答] miz [2008/12/14 10:06 ]

一発って、一行でってこと?
でもファイルからの読み込みの指定行は必要だと思うし、全行読まなきゃ残す物もわからないと思うよ。

日付は、本日の2ヶ月前を求めて比較すればいいと思いますが、これも含めて一行に放り込むのは、データ毎に同じ日付計算するのは無駄、と思うので、先に計算する方がいいと思います。
※ 2ヶ月前の同一日が欲しければ、use Time::Local; を使用するか、$monをチェックする必要があるでしょう。

##  年をまたぐ計算は面倒になったので 60日前計算で。
( $day, $mon, $year) =(localtime(time - 60*24*60*60))[3,4,5];
$datestr = sprintf('date=%4d/%2d/%2d',($year+1900),($mon+1),$day);
open(FH, '< filename');
## 一行ずつ読み込みつつ、grepで配列要素削除、60日前以降のデータを残す。ついでにsortも実行
@data =  map {$_->[0]}
      sort {$a->[2] cmp $b->[2]}
       grep { $_->[2] gt $datestr }
        map {[$_, split /,/]} <FH>;
## このあと別名ファイルに書き込んで、エラーが無ければ、rename で元のファイルに上書き


4:[完了] 999 [2008/12/16 14:19 ]

jamさん、mizさん 有難う御座います。

実行してみます。
また出来ない時は宜しくお願いします。

回答(必須): 状態:

お名前(必須):

URL:




[戻る]