プロが教える店舗&オフィスのセキュリティ対策術

PHPでCSVファイルのデータを取り込もうとしています。

全てのデータを表示させるのであれば、「while」などを使って書くのが一般的かと思うのですが、
最終行のデータ(「,」で区切られた最も左のフィールド)だけを取り出したいので、
以下のように書いてみました。

<?php
$file = fopen("hoge.csv","a+");
$nakami = fgetcsv ($file, 1000, ",");
echo $nakami[0];
fclose($file);
?>

「fopen」のmodeについて、「r」にすれば先頭から読み込まれ、
「a+」もしくは「ab+」ならばファイルの終わりにポインタが来る・・・
と色々なマニュアルに書かれていましたので、上記のようにしてみたのですが、
$nakami[0]で表示されるのは、1行目の最左列のデータになってしまいます。

1)このやり方(modeの設定)では最終行のデータ取得は不可能なのか
2)どのようなやり方なら最終行のデータ(のみ)は取得できるのか

お知恵をお借りできれば幸いです。
よろしくお願いいたします。

A 回答 (3件)

No1です。

No2の回答の方が確実です。
「予め行数がわからないときに、最後の要素(最終行のデータ)というのはどのようにしたら取り出せるものなのでしょうか。」

$file = fopen("hoge.csv","r");
$contents = file($file);
とした場合、配列$contentsに各行が格納されるから
count($contents)で要素の数を調べて、最終行は
$contents[count($contents)] になる。よって

$nakami=expload(',',$contents[count($contents)]);
echo $nakami[0];
かな。
    • good
    • 0

仮にファイルポインタが最後にきてしまったら結局


読むものはないでしょ?
(最後の行の最初の文字にシークするのではないんだから)
一行の文字数が固定であれば、fseekする手もありますが・・・。

普通にwhileでまわすので十分だと思いますけどね。
<?php
$fp = fopen("hoge.csv","r");
while( !feof($fp) ){
$nakami = fgetcsv($fp, 1000, ",");
}
fclose($fp);
echo $nakami[0];
?>
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
whileでやった場合、全データが取り込まれますが、
その中から、どうやって目的(最終行、最左列)のデータのみを
取り出せば良いのかが分からず手こずって質問させていただいた次第です。

お礼日時:2008/12/09 17:02

$file = fopen("hoge.csv","a+");でポインタを


最後に移動させるのは、ファイルへの追記書き込み
を行うためにやるもので、逆順に読み込みするための
ものではありません。
最初に、file()関数でファイル全体を配列に格納し、
最後の要素を','を区切りとしてexpload()で分解して、
その最後の行の要素を得れば?
(ただし、これだと実際は全件読み込む事になりますが)
    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございます。
やはりmodeは、私のような目的のためのモノではないんですね。
勉強になりました。

ところで、教えていただいた
「最後の要素を','を区切りとしてexpload()で分解して」
のところなのですが、exploadについてはおそらく「,」をデリミタにして
フィールド毎に分けていくということだと思うのですが、
予め行数がわからないときに、最後の要素(最終行のデータ)というのは
どのようにしたら取り出せるものなのでしょうか。
初歩的な質問で恐縮ですが、その点だけ補足いただけますと幸いです。
よろしくお願いいたします。

お礼日時:2008/12/09 15:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A