• 締切済み

数を指定してレコードを保存

お世話になります。 今、ひたすら貯めている(削除していない)ファイルがあります。 容量が大きくなってきたので、適当な(レコード)数を残し、 残りを削除したいと思います。 1つの命令で書けるのでしょうか、 それとも1個づつコピーしていかなければならないのでしょうか。 貯めているレコードはただ経緯を見るためだけに保存しているのであって、 関連性はありません。 やりたいことは、 100と指定したら最新の100個を残し、 101個目から以降の古いレコードを捨てたいのです。 (今現在7000個くらい貯まっています) 宜しくお願いします。

  • Perl
  • 回答数2
  • ありがとう数3

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

> 1つの命令で書けるのでしょうか、 > それとも1個づつコピーしていかなければならないのでしょうか ひとつの命令では書けないと思います。 一行ずつコピーすればよいのではないでしょうか。 ファイルには最新のレコードが先頭にあり、古いレコードが 続くという並びですよね。単純に先頭の 100行を違うファイルに コピーし、その後 ファイル名を元のファイル名に変えればよい のではないでしょうか。 Linux 系の OS を使っているのでしたら、system 関数で OS コマンドを 呼び出し system "head -100 orig_file > new_file && mv -f new_file orig_file" とする手もあります。

nagahaha
質問者

お礼

有り難うございました。 一つの命令では書けない件、 了解です。 やはり指定された数だけ繰り返すようなロジックを作る必要があるのですね。 お世話になりました。

回答No.1

ファイル = レコード だとすると #!/usr/bin/perl use strict; use warnings; use File::stat; use POSIX 'strftime'; my $dir = shift || './'; my $save_count = shift || 10; chdir $dir or die "$dir:$!\n"; my %mtime_of; opendir my $dh, './' or die "$dir:$!\n"; while ( my $file = readdir $dh ) { # ヂィレクトリ直下のファイルのみ削除対象とする if ( -f $file ) { my $sb = stat($file); $mtime_of{$file} = $sb->mtime; } } closedir $dh or die "$dir:$!\n"; # 最終更新日時 (mtime) でソート print "--- Directory $dir\n"; my $count = 1; foreach my $file ( sort { $mtime_of{$b} <=> $mtime_of{$a} } keys %mtime_of ) { my $date = strftime( '%Y-%m-%d %H:%M:%S', localtime( $mtime_of{$file} ) ); if ( $count <= $save_count ) { printf( "SAVE %08d %s %s\n", $count, $date, $file ); } else { printf( "DEL %08d %s %s\n", $count, $date, $file ); # ファイル削除。要注意!!! ### unlink $file or die "$file:$!"; } $count++; } --- $ perl 'File-Stat.pl' /var/log --- Directory /var/log SAVE 00000001 2009-08-28 20:50:01 cron SAVE 00000002 2009-08-28 20:44:58 messages SAVE 00000003 2009-08-28 09:20:15 secure SAVE 00000004 2009-08-28 09:20:15 wtmp SAVE 00000005 2009-08-28 09:19:09 yum.log SAVE 00000006 2009-08-28 09:14:44 lastlog SAVE 00000007 2009-08-28 04:03:42 rpmpkgs SAVE 00000008 2009-08-27 06:14:59 Xorg.0.log SAVE 00000009 2009-08-27 06:14:58 acpid SAVE 00000010 2009-08-27 06:14:09 dmesg DEL 00000011 2009-08-26 06:09:09 Xorg.0.log.old DEL 00000012 2009-08-24 07:10:48 backup.log DEL 00000013 2009-08-23 10:27:58 backup.log.1 DEL 00000014 2009-08-23 05:52:49 ntp.log DEL 00000015 2009-08-23 05:52:26 clamav-err.log DEL 00000016 2009-08-23 05:52:26 clamav-scan.log DEL 00000017 2009-08-23 04:02:17 boot.log ...

nagahaha
質問者

お礼

早速、有り難うございました。 誠に申し訳在りません。 ファイルを例示すれば良かったのですが。 遅ればせながら、 ファイル名はxxx.logで、 中身は以下のようなモノです。 20090828<>1856<>181492<><><>25243<><>12505<><> 20090828<>1404<>181507<><><>25248<><>12505<><> 20090828<>0903<>181535<><><>25246<><>12514<><> 20090828<>0820<>181536<><><>25247<><>12514<><> 20090827<>1444<>181564<><><>25261<><>12511<><> 20090827<>1023<>181566<><><>25265<><>12514<><> 20090827<>0839<>181566<><><>25264<><>12513<><> 20090826<>2016<>181626<><><>25267<><>12519<><> 20090826<>1631<>181644<><><>25269<><>12523<><> 20090826<>1453<>181658<><><>25269<><>12524<><> 20090826<>1318<>181663<><><>25269<><>12524<><> 20090826<>1106<>181682<><><>25273<><>12526<><> 20090825<>0601<>181780<><><>25275<><>12520<><> 20090824<>1625<>181849<><><>25274<><>12530<><> 20090824<>0831<>181879<><><>25275<><>12534<><> (適当に最新のモノから数個、1行が1レコードです。) これが7000個(レコード)ほど繋がっています。 出力はレコードを作り、pushしています。 そしてやりたいことは、 残したい数、例えば100個を指定したら、 6900個を捨てて最新のモノから100個を出力(コピー) したいのです。 説明が下手で済みません。 宜しくお願いします。

関連するQ&A

  • VERITAS Record Now等の書き込み後の保存データについて

    PC初心者レベルの質問ですみませんが、ソフトの仕組みがよく分かっていないので詳しく教えて下さい。 「VERITAS Record Now」や「Ulead DVD MovieWriter」でCDやDVDに書き込む際に、 一旦HDに保存してから書き込まれていますが、保存されたデータはその後HD(Cドライブ)に残っているのでしょうか? Ulead DVD MovieWriterの場合はSmartVisionの元のデータをその都度削除していますが、 それだけで大丈夫でしょうか? VERITAS Record Nowは書き込み後に何もしていませんが、自動的に保存データが消えるようになっているのでしょうか? Cドライブの容量がどんどん増えていくのではないかと心配になっています。

  • MOのディスクに保存できるファイル数

    こんにちは。 MO(230MB)に保存できるファイルの数に制限はあるんですか? 現在172個のファイル(フォルダなし)を保存しているMOがあるのですが、173個目のファイルをコピーしようとすると、エラーとなります。 ※容量は2/3以上空きがあります。 よろしくお願いします。

  • レコードを削除しても容量が減らない

    毎度お世話になっております。 似た内容の質問を http://okwave.jp/qa5095173.html でしているのですが、求める内容が異なるため別途質問いたします。 質問本文 一度大きくなってしまったDB容量を、 レコード削除後に減らす方法を教えてください。 また、それをストアドで実行する方法があれば教えてください。 以下、状況と経緯になります。 SQL SERVER 2005 EXPRESS で、とあるテーブルに、 EXPRESSの容量限界である4GBまでレコードを詰め込みました。 試験前68.00MBだったデータベースは、試験終了後4088MBとなりました。 試験後、増やしたログテーブルをTruncateし全てのレコードを削除しました。 DBサイズも減るかと思いましたが容量は68.00MBに戻らず4088MBから減りません。 「使用可能領域」が4000MB以上の値を示し 事実DB使用上は何の問題はないのですが、 DBサイズを参照し、DB使用率を表示するレポートを作成しておりまして、「保存レコード件数が少ないのにDBサイズは大きいまま」という状態を何とか回避したいのです。 最適化という方法があると聞き、 http://okwave.jp/qa2283438.html を参照し、真似てみたのですが十分な理解・結果を得られなかったので質問いたします。 どうかよろしくお願いします。

  • DVD shrinkの保存先について

    DVD shrinkの保存された場所がわかりません。最初はハードディスクに保存されていたので容量が大きいから削除しました。再度、コピーするDVDを入れて削除しようと思ったらファイルが見つかりません。容量が思いから削除だけでもしたのですがどうしたらよいのでしょうか?お願いします

  • 任意レコードのハンドリング

    お世話になります。 早速ですが、 cgiで日記を作って、毎日入力しています。 現在の機能として最新分のみは修正が可能です。 (最後のレコードを表示し、修正して、置き換え) このほど、任意の日付分を修正できるようにしたいなと思い検討を開始しました。 そこで質問ですが、 どのような考え方をすればよいのでしょうか。 私のレベルで思いつくのは、 1件ずつ該当の日付が来るまでコピーしながら読んで行き、 該当日付が出てきたら表示、修正させ、置き換える、 そして残り分をコピーする、です。 こんな方法しかないでしょうか。 ズバリ、該当の日付分を抽出できるような考え方は無理でしょうか。 日記のフォーマットは単純なテキストで、1日単位で1レコード(長さ可変)になっています。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • AS/400のレコードのコピー方法について

    AS/400のレコードのコピー方法について AS/400で管理している1つの物理ファイル(DB)から別の物理ファイルにデータをコピーする場合についての質問です。 現状、テーブル[A]と[B]が存在し、レコード様式や各フィールドなどは全く同じです。[A]をコピーして[B]を作った状態です。 この状態で[A]から一部のレコードを抽出して[B]にコピーをします。 その後、[B]でレコードを加工し、上記作業で[B]にコピーしなかった残りの[A]のレコードをコピーしたいと思います。 結果的に、最初のコピー作業で[B]にコピーされたレコード以外は件数も内容も全く同じ2つの物理ファイルになるという状況です。 ここで、解らないのですが、2回目の[A]から[B]へのコピーをコマンドで行う事はできないでしょうか? CPYF コマンドを使用して、MBROPT(*ADD) にすればできそうだと思ったのですが、重複レコード(最初に[B]にコピーしたレコード)以外をコピーするという項目が見つからず困っております。 INCREL を使用するのかとも思いましたが、比較値にフィールド名を指定する事ができないため不可能です。 RPG3やCLを使えばできそうではあると思うのですが、この程度の機能がAS/400に基本機能として備わっていないとは思えずに調べていたのですが、どうしても見つかりません。 アドバイスをいただけると幸いです。 以上、よろしくお願いいたします。

  • 外付けハードディスクへの保存について

     知識不足なのでお教えください。  (1) Cドライブが満杯になりそうなので、外付けハードディスクにコピーをしようと思いますが「コピーと貼り付け」と「送る」とでは何が違うのでしょうか?    (2) また、元データを削除すると、リンクしていて「コピー」または「送る」で保存したデータまで削除されるのでしょうか?  (3) Cドライブの何を削除して容量を空けていいのか分かりません?  ちなみに、Cドライブの容量は46.5GBで現在の空きは3.12 GBです。

  • ニーモニックを使った命令の2進数表記

    計算機の、ニーモニックを使った命令を二進数表現するという問題なのですが、LOAD、STOREなどのニーモニックについては教科書に載っているのでわかりますが、以降のレジスタ、番地指定などの2進数表現が教科書に具体的に載っておらず、困ってます。 回答宜しくお願いします。 (問題は、r0の内容を300+r1番地に格納する命令です)

  • USBに保存できない

    USBに画像ファイルを保存しようとしたところ「画像をコピーできません ディレクトリまたはファイルを作成できません」と表示され保存できません。 また以前は一部のファイルだけだったのですが、今はすべての画像ファイルが保存できません。 いくつかファイルを削除したあとならその分保存できるので容量の問題かとも思うのですが、保存容量を見てもまだまだ余裕がありますし、何が問題なのかわかりません。 他の似たような質問の回答を見たところ、サブディレクトリを作ってそこに保存すればよいとのことでしたが、サブディレクトリとは何でしょうか?またどのように作成するのでしょうか? また他の理由があり保存できないのであればご教授ください。 よろしくお願いいたします。

  • iPod歌詞のために指定の文字数で改行させたい

    iPod nanoの歌詞表示幅が全角15文字なので、 それに合わせて歌詞編集しています。 今、ミミカキエディット最新βを使っています。 指定の文字数で見かけ上は改行させられます。 実際に指定の文字数でテキスト内容を改行させるには、 どうしたらいいでしょぅか。 いくらやってもわかりませんでした。 別のアプリで可能であればそれでもいいです。

    • 締切済み
    • Mac

専門家に質問してみよう