最近、いつ泣きましたか?

再び新規質問で申し訳ありません
これしか方法がわからなかったもので;

csvデータから最初の項目に5というものが含まれている場合
その列を表示する、というのを先ほど質問させていただいて解決に至りました。
csvデータファイルの内容
5,データ1,データ1の説明
5,データ2,データ2の説明
5,データ3,データ3の説明
6,データ4,データ4の説明
・・・

open(IN, "data.csv");
while (<IN>) {
if ((split(/,/))[0] == 5) {
print $_. "\n";
}
}
close(IN);

これで最初の欄に5が含まれている列だけ表示されるのですが
htmlに出力すると、そのまま下記のように表示されます
5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明
これでは余りにみずらいので、以下のように変更しました
open(IN, "data.csv");
print "<table>";
while (<IN>) {
if ((split(/,/))[0] == 5) {
print "<tr><td>". $_. "</td></tr>";
}
}
</table>
close(IN);
これで少しは見やすくなったのですが・・・
↓のように。
5,データ1,データ1の説明
5,データ2,データ2の説明
5,データ3,データ3の説明
この,で区切られた部分も</td><td>で表示したいのですがうまくいきません。
先ほど質問した時に教えていただいたURLを参照しましたがサッパリでした;
検索で、csvファイルをリストに格納して
print "<table><tr>";
print "<td>$data_view[0]</td>";
print "<td>$data_view[1]</td>";
print "<td>$data_view[2]</td>";
print "</tr></table>";
と表示させれば良い、という記事をみつけたのですが
これをすると
先ほど成功した最初のデータに5が一致した分だけ表示させる、という部分が機能しませんでした;;

まだまだ勉強不足かとは思いますが何卒お願い致します

A 回答 (2件)

$_を2次元配列だと思って扱えばよいのでは。



while (<IN>) {
if ((split(/,/))[0] == 5) {
## ↑2次元まで指定できている
print "<tr><td>". $_. "</td></tr>";
## ↑1次元目までしか指定されていない
}
}

実際には$_[i]の中身は配列ではなく、「,」で結合されている文字列ですので、「データ1の説明」にアクセスするには、if節でやったように、「,」で切り分けて添え字を指定してやればいいと思います。

初期処理として、csvデータの中身を本当に2次元配列に放り込むという手もあります。
データをほかの処理でも使うなら、こっちの方が便利だと思います。
    • good
    • 0
この回答へのお礼

他の処理で使う事のない、単純な機能ですので今回は参考までにさせて頂きます
大変勉強になりました、有難うございました!

お礼日時:2004/06/09 12:03

カンマで分割したリストを @data_view に格納し、その後で $data_view[0] == 5 のデータのみを表示すればよいでしょう。



open(IN, "data.csv");
print "<table>";
while (<IN>) {
  chomp;   # 末尾の改行を落とす
  my @data_view = split /,/;
  if ($data_view[0] == 5) {  # 先頭のデータが 5 なら表示
    print "<tr>";
    print "<td>$data_view[0]</td>";
    print "<td>$data_view[1]</td>";
    print "<td>$data_view[2]</td>";
    print "</tr>";
  }
}
</table>
close(IN);

※インデント等に全角空白を使っているので、コピーする場合はタブなどに変換してください。
    • good
    • 0
この回答へのお礼

有難うございます!無事に解決しました!!
なるほど、このようにするんですね~勉強になりました

お礼日時:2004/06/09 12:02

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