• ベストアンサー

ファイルの入出力2

指定したフォルダ内にあるcsvファイルのデータを 指定したhtmlファイルに出力するプログラムを書いているのですが、 下記のままだとcsvファイルにあるすべてのデータをとってきてしまいます。実現させたいことは「指定したフォルダ内にあるcsvファイル2行目のデータだけファイル出力する」というものです。 どなたかご協力お願いします。 #!/usr/bin/perl #--------------------------------------------------------------# # ディレクトリを開く #--------------------------------------------------------------# opendir(DIR,"test/"); #--------------------------------------------------------------# # 出力ファイル名を指定 #--------------------------------------------------------------# $dest = "test.html"; open (OUT, ">$dest") or die "$!"; #--------------------------------------------------------------# # 出力ファイルにhtmlを出力 #--------------------------------------------------------------# print OUT '<html> <head> <title>無題ドキュメント</title> <style type="text/css"> <!--.style1 {color: #FFFFFF}--> </style> </head> <body> <table width="419" height="105" border="0" cellpadding="0" cellspacing="0"> <tr> <th bgcolor="#000000"><span class="style1">名前</span></th> <th bgcolor="#000000"><span class="style1">住所</span></th> <th bgcolor="#000000"><span class="style1">性別</span></th> </tr>'; #--------------------------------------------------------------# # ディレクトリにあるファイル名を取得 #--------------------------------------------------------------# while ($filename = readdir(DIR)) { # ディレクトリにあるファイルパスを取得 $path = "test/$filename"; if(-f $path) { # ファイルオープン open (IN, $path) or die "$!"; while (<IN>) { # カンマ区切りでデータを取得&改行削除 chomp(@data = split(/,/, $_)); print OUT "<tr>\n"; # 各行の3つのカンマ区切りデータを取得 print OUT "<th bgcolor=\"#666666\">",$data[0],"</th>\n<td>",$data[1],"</td>\n<td>",$data[2],"</td>\n"; print OUT "</tr>\n"; } close(IN); } } #--------------------------------------------------------------# # ディレクトリを閉じる #--------------------------------------------------------------# closedir(DIR); print OUT "</table> </body> </html>"; #--------------------------------------------------------------# # ファイルを閉じる #--------------------------------------------------------------# close(OUT);

質問者が選んだベストアンサー

  • ベストアンサー
  • luka3
  • ベストアンサー率72% (424/583)
回答No.1

while (<IN>) { ↑ここを <IN>; <IN>; として、close(IN) の前の } を削除してください。

trfnc223
質問者

お礼

回答ありがとうございます。 やってみたんですあが、 どうもうまくいかないみたいです。 htmlは生成されますが、中身がカラのようです。 ちなみに<IN>;<IN>;というのはどういうことなのでしょうか。

その他の回答 (3)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.4

#2です。 どうやらchompの位置がわるいようでした。 # カンマ区切りでデータを取得&改行削除 chomp($line[1]); @data = split(/,/, $line[1]); としたら動きます。

  • luka3
  • ベストアンサー率72% (424/583)
回答No.3

すみませんでした。 2つめの「<IN>;」を「$_ = <IN>;」に変えて下さい。 <IN>はINのファイルハンドルから1行読み込むということです。 1行目は無視して、2行目の処理をする、ということになります。

trfnc223
質問者

お礼

ありがとうございます!! ファイルハンドルのそもそもの意味を理解してませんでした。。 解決しました!!!

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

open (IN, $path) or die "$!"; while (<IN>) { # カンマ区切りでデータを取得&改行削除 chomp(@data = split(/,/, $_)); print OUT "<tr>\n"; # 各行の3つのカンマ区切りデータを取得 print OUT "<th bgcolor=\"#666666\">",$data[0],"</th>\n<td>",$data[1],"</td>\n<td>",$data[2],"</td>\n"; print OUT "</tr>\n"; } close(IN); ↓ open (IN, $path) or die "$!"; @line = <IN>; close(IN); # カンマ区切りでデータを取得&改行削除 chomp(@data = split(/,/, $line[1])); print OUT "<tr>\n"; # 各行の3つのカンマ区切りデータを取得 print OUT "<th bgcolor=\"#666666\">",$data[0],"</th>\n<td>",$data[1],"</td>\n<td>",$data[2],"</td>\n"; print OUT "</tr>\n";

trfnc223
質問者

お礼

ご回答ありがとうございます。 試してみたんですが、 chomp(@data = split(/,/, $line[1])); の行でシンタックスエラーとなっていまいました。 なぜでしょう???

関連するQ&A