ここから本文です

CGIで csvファイルを下から、10人分読込む方法を教えてください。 山田,50,M 千...

彗星さん

2007/6/1018:23:25

CGIで
csvファイルを下から、10人分読込む方法を教えてください。
山田,50,M
千葉,34,W
佐藤,45,W


と言った感じのcsvファイルです。
ちなみにファイルの上側からは読込めてます。 M(_ _)M

--------------------------
●ファイルの上側10名の場合
open (FH,"<database/data.csv") || die "失敗。:$!\n";
for ($i=0;$i<=10;$i++){
$a[$i]=<FH>;
}
close(FH);

後で、$a[$i] をひっくり返してHTMLで書き出しをしてます。
for ($i=10;$i>=0;$i--){
print "$a[$i] <BR>\n";
}

補足回答ありがとうございます。
誤解を招く書き方ですいません。

本当は履歴のファイルを作ろうとしています。
時間順に100以上の履歴があって、下から、10件を表示させようとしています。

reverse関数検討してみます。

閲覧数:
1,074
回答数:
3

違反報告

ベストアンサーに選ばれた回答

bc2********さん

2007/6/1020:48:57

そうかなあ。質問者さんも回答者さんも、それじゃPerlで書いてる意味ないですよ。

push, pop を使うんじゃないですか。
せっかくPerlを使ってるのに配列をインデックス(添え字)で
コントロールするなんて、もったいない。
Perlの便利なところを利用してないですね。

<例>
open FH, "data.csv" or die "Can't open file! : $!\n";
while (<FH>) {
push @a, $_;
}
close FH;
for($i=0;$i<10;$i++) {
print pop @a;
}

質問した人からのコメント

2007/6/16 07:48:38

ありがとうございました
bc234567890さんの案を使ってます

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

kwi********さん

2007/6/1117:56:59

ファイルポインタを操作して後ろから読み込むようなこともできないことないです。
#大きなファイルだと有効ですけどね。
ただちょっと面倒くさい。

この程度でよければ、読み込みながら配列の先頭に入れていき(unshift)、
配列を常に10件にするよう後ろを削る(spliceやpop)
てなことすればよいでしょう。

ex.
use strict;
my @aRow = ();
while(my $sRow = <DATA>)
{
chomp($sRow);
unshift(@aRow, $sRow);
splice(@aRow, 10);
}
print join("\n", @aRow);
__DATA__
A:1
B:2
C:3
D:4
E:5
F:6
G:7
H:8
I:9
J:10
K:11
L:12

csh********さん

2007/6/1019:03:31

あなたがイメージしている通りの配列の操作は、reverse関数を使えばいいと思います。
あるいはCSVをあらかじめ逆さに保存しておくとか。

どうしてもと言うなら、

・seekなどで改行コードから改行コードまでのアドレスを保存した配列をつくる。
・その改行コードの最後の要素+1のアドレスから次の改行コード(またはEOF)まで順にread関数で読みだし、配列へ入れる。

かなあ・・なんかあまり意味がなさそうですが。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる