あるフォルダにはいっているすべてのcsvファイルのデータをひとつのテキストファイルに出力したいのですが、うまくいきません。
わからなかったのでとりあえず、別々のファイルで下記を
実行してみました。
■指定のフォルダに入っているファイル名をすべて出力。
これはうまくいきました。csvファイルが3つほど入っているのですが、
3つのファイル名が出力されます。
#!/usr/bin/perl
opendir(IN,"test/");
while ($filename = readdir(IN)) {
$path = "C:/perl/test/$filename";
$source = $filename;
print $source,"\n" if -f $path;
}
■指定のファイル(a.csv)の中身をtest.htmlとしてファイル出力
これもうまくいきました。カンマ区切りのデータが、
行ごとにあるだけはいっていき、htmlのテーブルにがつがつはいっていきます。
#!/usr/bin/perl
my $source = "a.csv";
open (IN, $source) or die "$!";
my $dest = "test.html";
open (OUT, ">$dest") or die "$!";
print OUT '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<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 (<IN>) {
chomp;
@data = split(/,/, $_);
print OUT "<tr>\n";
print OUT "<th bgcolor=\"#666666\">",$data[0],"</th>\n<td>",$data[1],"</td>\n<td>",$data[2],"</td>\n";
print OUT "</tr>\n";
}
print OUT "</table>
</body>
</html>";
つまり、この二つを1ファイルにまとめたいのです。
一個目で取得したファイル名リストを
2個目のopen で順次ファイルの中身を取っていってほしいのです。
いったんファイル名をテキストファイルに出力してから、
それを読む方法もあったのですが、
できたら、ファイルを出力せずに変数からそのまま、
ファイル名の一覧を取得したいと思っています。
どなたか教えていただけますでしょうか。
No.1ベストアンサー
- 回答日時:
#!usr/bin/perl
opendir(DIR,"test/");
$dest = "test.html";
open (OUT, ">$dest") or die "$!";
while ($filename = readdir(DIR)) {
$path = "test/$filename";
$source = $filename;
if(-f $path){
open (IN, $path) or die "$!";
print OUT '<!DOCTYPE html PUBLIC
(以下、表の1行目が終わるまで略)
while (<IN>) {
chomp;
@data = split(/,/, $_);
print OUT "<tr>\n";
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);
(3行略)
close(OUT);
こんな感じでしょうか。
ポイントは
・1つ目のでファイルを見つけるごとに2つ目の処理を実行する。
・出力先ファイルは先に開いておいて、最後まで閉じない
この辺りでしょうか。
詳しくはソースの違いを良く見て理解して下さい。
自分でひとつにまとめた時(動かなかったものですね)のソースも手元に置いて、比較すればなお良しです。
分からなければ補足しますが。
ちなみに、コードには、私なりのスタイルが入っててその辺りごっちゃになってますが、まぁ、何とかなるかと思います。
ご回答ありがとうございます!
考え方は理解できたような気がします!
whileを入れ子にするんですね。
ちょっと試してみます!
もしかしたらまたおたずねするかもしれません。
その時はどうかよろしくお願いします。。。。
No.2
- 回答日時:
検索対象のディレクトリには .csv以外のファイルもなかったりしないのでしょうか?
あと、ディレクトリを再帰的に潜って行くこともしないでいいのですよね?
opendirで自分でディレクトリエントリを読んで行くとファイルの振り分け
とかが面倒だと思うので、globを使ってみました。
#!/usr/bin/perl
use strict;
use warnings;
my $targetdir = shift || 'test';
my @filelist =glob( $targetdir . '/*.csv' );
open my $of, '>', 'output.html' or die;
print $of <<END_OF_HEADER;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "?http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="?http://www.w3.org/1999/xhtml">?
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<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>
END_OF_HEADER
foreach my $file (@filelist) {
open my $if, '<', $file or warn "can't open $file";
while (<$if>) {
my @fields = split q{,}, $_;
print $of <<END_OF_TEMPLATE;
<tr>
<th bgcolor="#666666">$fields[0]</th>
<td>$fields[1]</td>
<td>$fields[2]</td>
</tr>
END_OF_TEMPLATE
}
close $if;
}
print $of <<END_OF_TRAILER;
</table>
</body>
</html>
END_OF_TRAILER
close $of;
ヘッダとかトレイラーのところはサブルーチンにしたいところですが
とりあえずはこんなところで。
ご回答ありがとうございます!
なにぶん初心者なものでglobというものを使ったことがなかったのですが、
とりあえず実行してみたらきれいにできました。
いただいたコードをひもといて自分で勉強したいと思います!
ありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- HTML・CSS (Javascript)印刷するファイルに応じて印刷プレビュー画面で用紙を自動的に切り替えたい!! 2 2022/04/11 12:04
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
while(<ハンドラ>) {} で行数を...
-
perlで、文字列の中から何番目...
-
オープンしたファイルで行の連結
-
ファイルから読み込んだ文字を
-
perlのflock関数でロックをかけ...
-
close()で例外が投げられる理由
-
AutoCADのスクリプト
-
テキストファイルの本文中に行...
-
cgiの投票回数制限設定について...
-
batファイルでrenameができませ...
-
エラー 'dir.h' : No such fi...
-
HTMLのフォームで画像と文...
-
ExcelをCSV書き出す場合のシー...
-
awkスクリプトでダブルクォーテ...
-
Perlの変数に文字数制限(容量...
-
readdir()で得られるファイル・...
-
ファイル全てを .xlsm に変更し...
-
パスから最後のディレクトリだ...
-
テキストデータから指定した1...
-
一定時間が経過したフォルダの削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlのflock関数でロックをかけ...
-
改行コードが勝手に
-
巨大ファイルの行をを逆順に並...
-
オープンしたファイルで行の連結
-
Perl で syntax error
-
where can I buy snowbord in t...
-
open中のファイルをrename
-
perlを用いた特定文字列間の抽...
-
Perlで他サイトの情報を取得し...
-
die関数のエラー出力先について
-
ハッシュにファイルハンドル
-
サブスクリプトとのファイルハ...
-
テキストファイルの本文中に行...
-
perlで大容量CSVのsort方法につ...
-
フォルダが開かなくなりました。
-
AutoCADのスクリプト
-
ジョブショップスケジューリング
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
おすすめ情報