ファイルの最後の行を取得する

2023/6/25 [01:45:40] (日) 天気

perlを使ってテキストファイルの最後の行を取得したい、というネタ。

tailでええやんということだけど、外部コマンドを使わないでperlだけで完結させたい。


ファイルを全部読み込んで最後の行だけを取り出す。

open(FH, $file); my @buf=<FH>; close(FH); pop(@buf)

これが一番簡単だし、ファイルを配列に全部読み込むのでその後の展開も応用にも使える、ド定番なやりかた。

読み込む、処理したいのがテキストファイルなら、ファイルサイズもしれてるだろうから、これで十分。わたしもいつもは何をするにもこのやり方。


だけど、データベースに食わせる元ネタのcsvファイルとかログファイルだと、ファイルサイズがギガバイトサイズのものがあったりして頭が頭痛。

最終行だけを知りたいのに、そんな阿呆みたいにでかいファイルを全部読み込むのは流石にもったいなくて馬鹿馬鹿しい、という貧乏性、ていうかリアルでビンボなんだけど。


ぐーぐる先生に聞いてみたら、検索結果からそのものズバリは見つけられなかったけど、seek()を使うのが良いらしいということはわかったのでスクリプトを書いてみた。


my $file = ’input.csv’;
my $filesize = (stat($file))[7];
open(FH, $file) || die;
my $pos = ($filesize - 3);
while(--$pos){
    my $buf;
    seek(FH, $pos, 0);
    read(FH, $buf, 1);
    last if $buf =~ m![\r\n]!;
}
my $line;
seek(FH, $pos+1, 0);
read(FH, $line, ($filesize - $pos) );
close(FH);
print $line;

seekはファイルハンドルのファイルポインタを任意の位置に設定する、つまり、開いてるファイルのどこを見るのかを指定できる。

ファイルサイズ=ファイルの末尾の位置から1バイトずつ先頭に向かってずらしていって、その位置から1バイト読み込んで、それが改行コードだったら、そこが最後の行の始まりということになる。


初期値をファイルサイズ-3としたのはファイル末尾に改行コードがあったらそこで終了してしまうから。

改行コードのバイト数はLFやCRだけなら1バイト、WINDOWSで一般的なCRLFは2バイト。なので、3バイト戻して1バイトを読むことで、最後の改行は無視できる。


まだ実際に大きなファイルに対して使ってないし、seek()で1バイトずつポインタをずらして1バイトずつ読み込んで、というのが本当に効率的なのかはよくわかってない。少なくとも、ファイルを頭っから順に読んでるわけじゃないのでファイルの大きさは関係ない、はず。

ファイルサイズが大きくなるにつれ、処理速度もそれにつれて遅くなるようなことにはならない。


とりあえずこいつを暫定首位に認定しておこう。


perlは本当にいろんなことをいろんなやり方でできるのが気持ち良い。

今回、ぐーぐる先生に聞いてみたら、古いエントリばかりが目立った、てことはもうあまり使われていない、ポピュラーな言語じゃなくなった、のかも知れない。

ていうか、この世界、あっという間に古びる。perlもすでに古代語となって、perl話者が少なくなってきたということかもしれない。ラテン語やサンスクリット語みたいなポジションになったのかもなあ。


だけど、perlはええぞ、マジで。

image

よく見る夢

2023/6/21 [08:46:36] (水) 天気

時々、同じ夢を見る。それはいくつかあって、同じ設定、同じ場所、同じ行動。

細部は多少違うけど、ほぼ同じで夢を見ながら、またここか、またこれか、と。


今日見た夢もそのうちのひとつ。


山に入っていく川沿いの細い道。緑の濃い森の中を延々と続く上り道と上りの細い石段。まだ登るのかとうんざりしながら疲れを覚える足を運ぶと、少し開けたところに出る。そこはどこにでもあるような鳥居と神社。またここかとほっとするような懐かしいような。

image

…で、目が覚めて、毎度同じでイメージが貧困だなあ、と呆れる。

この夢、というかこの場所、この道、この石段を年に何度か見てる。


記憶が確かなら、奈良吉野の天河神社に行ってから、時々見るようになった夢だ。

天河神社はいわゆるパワースポットと言われていて、その手のひとやメディアの御用達。「月刊ムー」や「東スポ」あたりも取り上げたことがあるんじゃないかな。


自分の中に神社を抱えているとかいうとそれっぽいんだけど、リアルでは残念ながらそっち方面とは無縁。


崖みたいな細い道を進むバスに揺られて峠をいくつも越えてたどり着いた天河神社、というか天川村の夏の風景が強烈に印象的だった、ということだろう。

小学校低学年の頃、6,7歳の頃、母親の実家の淡路島で夏休みを過ごすことが多かった。山を越えて、といっても淡路島に険しい山などないので、ちょっとした峠を越えると、目の前、視界がいきなり真っ青。夏の空と海。海水浴が夏休みの日課だった。

デジャヴというには遠すぎるけど、天河神社に行って真っ先に思い出したのが子供の頃の淡路島。自分なりの「原体験」ということなのかな。


今日見たこの夢、この場所。

みけさんを入れたキャリーバッグを持ってここに行く途中、道に迷って行ったり来たりする夢だった。

還暦を過ぎて道に迷ってるようじゃロクな死に方せんな、おれ。



天河神社のオフィシャルWEBページでも貼っておこう

https://www.tenkawa-jinja.or.jp/

わたしが行った頃とは違ってトンネルが開通したり、交通の便がかなりよくなってるっぽい。

夏休みにオススメ。みんなが思う夏休みがそこにあるんじゃないかな。

AIが人間の涙腺を殴りにきたんだけど

2023/6/15 [14:54:29] (木) 天気

みけさんが亡くなったことについては、今年27歳だし、フラフラ、よろよろと引きずるような歩き方も点滴を欠かせない腎臓のこともあって、少しは覚悟していた。


寿命ということを考えていた。


先日(6/6)亡くなった時を嫁さんとふたりで看取ることができた。

ご飯皿の前でへたりこんで、喉に何かがつまったような息というか咳をして、かすれた声を上げたのが最期だった。

幸い、といっていいのか、苦しみ痛みは少しだったように思う。突然死といってもいいかもしれない。


そんなこんなで初七日も経って、何気なく、AIお絵かきで、猫を描いてもらおうと思った。


japanese calico cat is walking, riverside in the forest,sunlight filtering through trees

三毛猫が木漏れ日のさす森の川沿いを歩いている。


といった、注文をしてみたら、AIが出してきたのがこのイラスト

image

猫とおかっぱの女の子なんて意図してなかったので心底ビックリした。

人間の姿になったみけさんと、猫のみけさんかよ。


わたしの英文、プロンプトの問題なんだろうけど…。

ちくしょう。歳食ってただでさえあちこち緩いんだ。一瞬で涙腺が決壊させられたじゃないか。ちくしょう。

寿命と余命

2023/6/15 [07:13:16] (木) 天気
image

おんなじ命でもえらい違いがあるんやなあ、寿命と余命て。寿がれる、祝福される命とやな、余りもん、残りもんの命やで。そりゃえらい違いやろ。余ってるんやったら、ちょっとでええからこいつに分けてくれへんかなあ。頼むわ。

GBLシーズン15でACE到達

2023/6/14 [09:26:35] (水) 天気

ポケモンGOの対人戦GOバトルリーグ。シーズン15「隠された宝石」シーズンでACE到達。


昨日、ランク20までの規定の勝利数を達成してもらった初期レートが1953。前シーズンの初期レートが1900ぐらいだったので、けっこうもらえた。

今シーズンのスーパーリーグというレギュレーションは、技変更などがあって前シーズンとは環境が激変。前シーズンが決まりきったテンプレパーティばかり出てきて、今イチ面白みに欠けたのことを考えると、今シーズンはパーティのバリエーションが豊富でかなり面白い。


いちいち一試合ごとに右往左往ジタバタすることになって負けが込むことも多かったんだけど「あーでもないこーでもない」が面白いんでスマホを投げるようなことにはならなかった。かな。


とりあえず。今シーズンも目標はこれで達成。まだまだシーズンは続くので、面白いゲームができればいいなあ、と。


image
<<2026/2>>
       
1234567
891011121314
15161718192021
22232425262728
検索:

【最近の20件】