こんにちは。
Perlでファイルを扱う場合、
open F,"./data.csv";としてオープンする場合、
オープンした段階ではまだファイルの中身はメモリに読み込まれてなくて、
例えば、一万行のファイルの場合
while (<F>) { } で五千行まできた場合、メモリには五千件まで読み込まれている。
という私の解釈なのですが、これで正しいのでしょうか?

A 回答 (1件)

 基本的にはそう考えて問題ないと思います。



 システム上に「先読みバッファ」プログラムなんかがロードされていれば、その機能によって「厳密にはすでに読まれている」というような状況にもなるかもしれませんが、ユーザーからすれば分かりませんからね。

 しかし実際にはそのようなプログラムがなくても、ハート的に「クラスタ」と呼ばれる単位ごとにまとめて読み込まれるので、内部では「五千件とちょっと」ということになるでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございました。
五千件目だけ読み込めると便利なのにな。。

また機会があったらよろしくお願い致します。

お礼日時:2001/12/12 17:30

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

このQ&Aと関連する良く見られている質問

QCSVをCGIで読み込み

現在飲食店のサイトを制作しておりまして、CSVをCGIで読み込み、メニューの一覧を作れればだいぶ作業が楽になるなと思っているのですが、
CSV形式でダウンロードするものはたくさんあるのですが、CSVを読み込むものがいいのが見つからないのですが、もしメニュー一覧を作成するのに特化したフリーCGIなどありましたらお教えくださいませ。

宜しくお願いします。

Aベストアンサー

メニューが隅々までしょっちゅうちょこちょこ変わって、
CSVでなら簡単に最新のデータがもらえる場合、
CGIで、そのCSVからメニューと個別ページを作るようなプログラムを専用に作ったほうがいいと思います。

ベースにするために、CSVをデータベースとして読み込んでくれるCGIから初めても、表示とかを調整している間に本末転倒になりそうな気がします。

もし、今回作成するだけでしたら、
一種のテキストファイルだと思って置換とかを駆使して力ずくで処理してしまった方が…。

Qデータの読み込み方法

CGI@Perlの質問です。

下記のような内容のdata.txtファイルがあります。
すべてを読み込みブラウザで表示する方法は本により理解をしたのですが、
このスクリプトを改良して、二行目のみを取り出し表示したり、
文字列(例:「ニ」がある行だけを表示)を検索して表示したいと思っています。

どなたかスペシャリストの方、下記のスクリプトに手を加え
分かりやすくご説明していただけないでしょうか?

よろしくお願いいたします。

○全部表示するスクリプト-------------------------
#user/local/bin/perl
$count = 1;
print"Content-type:text/html\n\n";
print<<EOF;
<html>
<head>
<title>テスト</title>
<head>
<body>
EOF
open(DATA,"data.txt");
while($count <= 3){
$data = <DATA>;
print "$data<BR>";
$count++;
}
close(MENU);
print<<EOF;
</body>
</html>
EOF
exit;
-------------------------------------

【data.txt】
一行目のテキスト
二行目のテキスト
三行目のテキスト

CGI@Perlの質問です。

下記のような内容のdata.txtファイルがあります。
すべてを読み込みブラウザで表示する方法は本により理解をしたのですが、
このスクリプトを改良して、二行目のみを取り出し表示したり、
文字列(例:「ニ」がある行だけを表示)を検索して表示したいと思っています。

どなたかスペシャリストの方、下記のスクリプトに手を加え
分かりやすくご説明していただけないでしょうか?

よろしくお願いいたします。

○全部表示するスクリプト-------------------------
#user/loca...続きを読む

Aベストアンサー

>現在、data.txtは3行しかないと分かっているので
>$count <= 3としていますが、もしdata.txt内に
>何行のデータがあるかわからない場合は、どのような
>書き方にすると良いか教えていただけないでしょうか?

と言う事で…再投稿です。
#$data = <DATA>;
@data = <DATA>; # $→@へ変更
foreach $line (@data) {# ファイル内容から一行だけ取得
if ($line =~ /二/) { # $dataを$lineへ変更
  print "$line<BR>"; # $dataを$lineへ変更
}
}

これならば[data.txt]の内容が0行であっても、1万行であっても対応出来る…(筈w)。

QCGIを読み込むと

お世話になります。CGIプログラムをサーバよりブラウザ上に読み込もうとすると、白い四角に赤い×マークが表示され表示できません。原因は何でしょうか?
漠然とした質問で申し訳ないです。
XP PRO SP2 、IE6.01を使用しています。

Aベストアンサー

白い四角に赤の×は、画像がありませんよってところですね。そのCGIってwanpeiさんが作ったCGIですか?そうでしたら、画像のアドレスを見直してみてください。wanpeiさんが作ったものでないなら、そのサイトの管理者に「画像が表示されないよ」って教えてあげてください。

QCSVを読み込んでメニューを作成する方法

メニューのページと、
日付や区分が載っているCSVがあります。

data.csvのレコード

2005/04/01 一般
2005/04/08 特別
2005/04/15 一般


このCSVを自動的に読み込んで、「一覧」をクリックすると、
該当の日付の一覧に飛ぶというページを作りたいのですが、
どういう風に作成すれば良いかわかりませんでした。
どなたかわかる方がいらっしゃいましたら、アドバイスを頂きたいのですが。

毎回HTMLの日付とリンクを更新すれば出来るのですが、
CSVの入れ換えだけで実現出来るようにしたいです。

下のタグがメニューの一部です。
2005/04/01や2005/04/08といった部分をCSVが読み込んで作成し、
一般や特別などの項目、一覧のリンクの"050401/index.html"という部分も自動的に作成出来るようにしたいです。

<table border="0" cellpadding="5" cellspacing="2">
<tr>
<td>2005/04/01</td>
<td>一般</td>
<td><a href="050401/index.html">一覧</a></td>
</tr>
<tr>
<td>2005/04/08</td>
<td>特別</td>
<td><a href="050408/index.html">一覧</a></td>
</tr>
<tr>
<td>2005/04/15</td>
<td>一般</td>
<td><a href="050415/index.html">一覧</a></td>
</tr>
</table>

自分ではこういった方法しか思い浮かばなかったのですが、
メニューを自動的に作りたいというのが趣旨です。
他の方法でも出来るのであればご指導頂きたいです。
CGIの知識はカスタマイズ程度の知識しかありませんので、
もしこちらに記載できるようなソースであれば書いていただけると大変助かります。
もしくは、フリーのCGIでこういったものを見かけたことがあるという方がいらっしゃいましたら、
教えていただけると助かります。
宜しくお願い致します。

メニューのページと、
日付や区分が載っているCSVがあります。

data.csvのレコード

2005/04/01 一般
2005/04/08 特別
2005/04/15 一般


このCSVを自動的に読み込んで、「一覧」をクリックすると、
該当の日付の一覧に飛ぶというページを作りたいのですが、
どういう風に作成すれば良いかわかりませんでした。
どなたかわかる方がいらっしゃいましたら、アドバイスを頂きたいのですが。

毎回HTMLの日付とリンクを更新すれば出来るのですが、
CSVの入れ換えだけで実現出来るようにしたいです...続きを読む

Aベストアンサー

かなり適当です
サンプル程度に。


#!/usr/bin/perl
print "Content-type: text/html\n\n";

open( XXX,"./data.csv" );
@LIST=<XXX>;
print "<table border=\"1\" cellpadding=\"5\" cellspacing=\"2\">";

for($i=0;$i<@LIST;$i++){
@LINE=split(/\,/,@LIST[$i]);
@DAY=split(/\//,@LINE[0]);
$YEAR=substr(@DAY[0],2,2);
$DIR=$YEAR.@DAY[1].@DAY[2];

print "<TR>";
print "<TD>@LINE[0]</TD><TD>@LINE[1]</TD><TD><A HREF=\"$DIR/index.html\">一覧</A
></TD>";
print "</TR>";
}

print "</TABLE>";

Qデータファイルからの情報の読み込みについて

現在、会員制の掲示板(Perl)を作成しています。
お名前、ご希望のID、メールアドレス、パスワードを入力して会員登録し、掲示板へはIDとパスワードでログインできるようになっています。

この掲示板を改造しようとしています。
会員制で投稿する人も限られているため、投稿フォームの名前やメールアドレス等は自動で入力されるようにしたいのです。
一度投稿するとCookieに保存されるというのではなく、<input type="text" .....>という入力欄を使用せずに強制的に(書換え不可能)ログイン者の名前等が表示されるようにしたいのですが…。

ちなみにスキンファイルを使用するタイプの掲示板なのですが、ログインする時にIDとパスワードを入力するためにIDの情報は持っているようで、IDでしたら表示させることはできたんですが、メールアドレスなど、ログイン時に入力していない情報は表示できません。

…ということは、ログインした後、もしくは書き込みをしようとする前に「データファイルから該当するIDの人のデータを探して読み込む」という指示をすれば良いのでしょうが、それがわかりません。

未熟な私にはわかりません!
お詳しい方、どうか助けてください!お願いします!

現在、会員制の掲示板(Perl)を作成しています。
お名前、ご希望のID、メールアドレス、パスワードを入力して会員登録し、掲示板へはIDとパスワードでログインできるようになっています。

この掲示板を改造しようとしています。
会員制で投稿する人も限られているため、投稿フォームの名前やメールアドレス等は自動で入力されるようにしたいのです。
一度投稿するとCookieに保存されるというのではなく、<input type="text" .....>という入力欄を使用せずに強制的に(書換え不可能)ログイン者の名前等が表...続きを読む

Aベストアンサー

IDが取れているのでしたら、会員ファイルを開いてIDを検索してメールアドレスなどを引っ張ってくればできます。

具体的なことはデータ形式が分からないとできませんが、

open(IN,"データファイル);
@data = <IN>;
close(IN);
foreach (@data) {
# カンマ区切りデータ
(@_) = split(/\t/);
if ($id eq $_[0]) {
$name = $_[1];
$mail = $_[2];
last;
}
}

とかやればいいのですが。
この辺も理解できない場合はその掲示板を壊すだけなので辞めたほうがいいかと思います。


このカテゴリの人気Q&Aランキング

おすすめ情報