1からなんですね。了解です。
ちなみに他のプログラムは経験ありますか?
僕はもともとC言語はやったことあったので、
Perlを身につけるのは、簡単なリファレンスを見れば
最初から知っていたのと同じぐらいの感覚で使えましたけど。
しかし、まったくプログラムが初めてだと難しいかもしれませんね。
1がわからないとすると、もっと前の部分がわからない可能性がありますね。
簡単に先ほど箇条書きしたとこだけ説明しておきますね。
それ以前でもっとわからないならまた補足してください(笑)
ただ、僕も自分の書きやすいように書いていますので、
他の方が見たら、「もっときれいに書けるのに」って思われてしまうかもしれませんが、
そのあたりはどうかお許しください。
まずはこんな風にやっていけば良いんだなとわかっていただければいいかと思います。
1. データを読み込む
~~~~~~~~~~~~~~~~~~
if (!open(DB,"$file")) { &error(1); }
@lines = <DB>;
close(DB);
ってのが僕がよくやるファイルの読み込みです。
このまま使って、「@lines」とか「DV」という文字を適当に変更すればいいです。
errorの関数は、ファイルが開けなかった場合だけ呼び出されます。
(これも別のところで作成しなければなりませんけどね)
その必要がない場合は
open(DB,"$file");
@lines = <DB>;
close(DB);
でも良いかもしれません。
$fileには読み込みたいファイルにアクセスするパスを書きますが、
たいてい最初に
$file = "food.csv";
とか
$file = "../data/food.csv";
などと書いておけば大丈夫です。
もちろんファイルを開くところに直接書いても良いですね。
これがうまくいけば、「@lines」にcsvファイルが行単位で取り込まれます。
つまり
10,果物,りんご,ringo.html,ぶどう,budou.html,ばなな,banana.html
10,野菜,かぼちゃ,kabotya.html,なす,nasu.html,きゅうり,kyuri.html,魚,まぐろ,maguro.html,さけ,sake.html
10,肉,牛,usi.html,麺,ラーメン,ra-men.html,そば,soba.html,うどん,udon.html
というデータだとすると、
$lines[0] に果物の行がそのままは入り(「,」等も含んだ形で)
$lines[1] に野菜の行が入り
$lines[2] に肉の行が入ります
元のデータはすべて一行に表されているんですか?
そうだとしたら、全データが$lines[0]に入りますので、
後でデータを分割する必要がありますね。
2. 読み込んだデータを変数に代入する
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
次に書く配列に入れたデータを、より使いやすく小さく区切ります。
その際にsplitという関数を使います。
splitは、各行から特定のパターンで文字列を分割します。
今回のcsvファイルならば、「,」でデータが区切られているので、
「,」を切り分けのパターンとして「果物」「りんご」「ringo.html」などのデータを取り出します。
現在は、
$lines[0] = "10,果物,りんご,ringo.html,ぶどう,budou.html,ばなな,banana.html";
という状態でデータが入っていますので
最初の2つだけデータの意味が違うのでそこを切り出して、
さらに2つずつ切り出さないとだめですね(なんだか切り出しにくいかも)。
まず、
($no,$type,$data) = split(/,/,$lines[0]);
としてみたとします。
この場合、
$no = 10;
$type = "果物";
$data = "ringo.html,ぶどう,budou.html,ばなな,banana.html";
という風に変数に代入されます。
後は$dataにあるデータがまだ分割しきれていないのでさらに細かく分ければいいかと思います。
3つずつセットのようなので、
for文などをうまく利用すればすっきり分割できるかもしれません。
・・・あまりに中途半端ですが、
ちょっと寝る時間を大幅に過ぎてしまいましたので(朝6時起きなんですよね;;)
今日は寝ます(笑)
2の補足、3についてはまた書き込ませていただこうかと思いますが、
ご自分で本などをみてわかっていただければ幸いです。
自分でだんだん理解して、それがほんとに実現できるのがうれしいもんですしね。
他の方もどんどん回答してあげてください。
ではではまた~(^^;)/
お礼
ありがとうございました。 お礼がしたいのでメールアドレスを教えてください。