- ベストアンサー
データファイルからのデータの取得方法
たびたびの質問ですみません。 初心者のため文法が理解できていないのか、今度はデータの読み込みでうまくいきません。 記述中のcgiファイルと同じディレクトリにdata.datというファイルがあり、そのファイルには三行のデータが記述されています。 内容は下記の内容です。 ---以下から--- 2006,03,18,,1800,グランド代,鈴木,公園,練習 2006,03,19,1500,,部費,加藤,#1鈴木,2006年度 2006,03,25,1500,,部費,加藤,#2太田,2006年度 ---以上まで--- このデータを各変数に割り当てたいのですが、うまくいきません。 下記のように記述していますが、いかがなモノでしょうか? ---以下から--- $fileline = 0; open FD, "<data.dat" || die $!; while (<FD>) { $fileline++; } close FD; open(FILE, "<data.dat") or printErrorPage("データファイルが開けません。"); eval{ flock(FILE, 1); }; @data = <FILE>; close FILE; for($k=0; $k<$fileline; ++$k){ ($year,$month,$date,$in,$out,$mono,$member,$etc1,$etc2) = split(/\,/, $data[$i]); $totalin = $totalin + $in[$k]; $totalout = $totalout + $out[$k]; } $totalinout = $totalin - $totalout; ---以上まで--- 最終的に$totalinには1500と1500が足されて3000と入って、$totaloutには1800と入って、$totalinoutには3000から1800が引かれて1200と計算されるようにしたいのです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
直接的な原因は、 >split(/\,/, $data[$i]); で、未使用の変数 $i を使用しているためです。 --------------------------------------------------------------- open(FILE, "<:encoding(Shift_JIS)", "data.dat") or printErrorPage("データファイルが開けません。"); eval{ flock(FILE, 1); }; while(<FILE>){ ($year,$month,$date,$in,$out,$mono,$member,$etc1,$etc2) = split/,/; $totalin += $in; $totalout += $out; } close FILE; $totalinout = $totalin - $totalout;
その他の回答 (1)
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 んっと…あちこち突っ込みどころはあるのですが(苦笑 まず、最初の6行は不要に見えるのですが如何なものでしょう? ファイルの行数を取るだけなら、その後に出てくる@data配列の個数を調べれば等価だと思います。 もし「for文のため」であるならば、foreachというものを調べてみてください。多分「ああこんな便利なものが…」になると思うので。 後は、デバッグプリントを入れてみるとよろしいかと。 print文をあちこちに埋め込んで、そのときの変数の状態を調べます。 例えばfor文の直後に print $data[$i] . "\n"; とやれば、現在扱おうとしている文字列がはっきりしますし。 ちぃと大変かもしれませんが、頑張ってください。
お礼
参考書を片手に、そして、他の方が作成したスクリプトを参考にしていました。 いわゆるデバッグプリントはやっているのですが、埋め込む場所がまるで意味がないところでした。 foreach、これから調べてみます。 ありがとうございました。
お礼
ありがとうございました。 記述までしていただき、大変参考になりました。