• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:サイト内全体を置換)

HTMLファイルにユニークなナンバーを埋め込む方法

このQ&Aのポイント
  • 現在、1つのサイトを全てローカルに保存した状態なのですが、このサイトの全てのhtmlファイルに、ユニークなナンバーを埋め込んでやりたいのです。ユニークナンバーは別ファイルで保存してあります(csvファイルです)
  • 現在のサイトの全てのhtmlファイルを検索し、ナンバーを埋め込んだ上で、元のディレクトリ構成を保ったまま、別場所に丸ごと出力することは可能でしょうか?(実行後には、元サイトと構成が全く同じで、ナンバーが埋め込まれたサイトが作成される)再起などを使用すればいいのだとは思うのですが、どう組んだものか正直見当がつかなかったため、質問させていただきました。
  • ご教授いただければ幸いです。よろしくお願いいたします。

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

  • ベストアンサー
  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.4

あ、 > my $srcpath="/somewhere/src/ ここはフルパス指定のつもりでした。 カレントパス以下のサブディレクトリ、ならば "./somewhere/src/"になります。 もし、カレントパスは決まっていないけど サブディレクトリはtest.plと同階層、という意味になると・・・ perlだけで書くなら、 $0=~m#[^/]*$#; my $srcpath="$&somewhere/src/"; # $0のパス部分をsrcpathの先頭に。 $srcpath=~s#^(?=[^/.])#./#;   # [./]以外で始まる時は'./'をつける という感じでしょうか。 これはややこしいので、 通常は上の、フルパスか相対パス指定のどちらかにしますね。 最後のforeachは必ず通りますが、 if(exists・・・){~} の最後で delete $no{$hkey} してあるので、 (CSVにはあるがファイルとしては存在しなかったもの) だけが この時点での%noには残っていて、foreach&printされます。

lefthand77
質問者

お礼

おおおおおお!!できたーーーー!! 感謝感激です!! フルパス指定のやりかたすらわからないど素人に根気良く教えていただき、本当にありがとうございます。 今はまだ全然ですが、いつかthatsthat様のように、教えることが出来るよう努力したいと思います。 ありがとうございました!!

その他の回答 (3)

  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.3

最初のwhile(<>){~}の部分では、csvファイルを読み込んで、 ハッシュ変数%noに格納しています。 ご提示いただいたcsvファイルの例ですと、  $no{'index.html'}='<!--1-->';  $no{'a/index.html'}='<!--2-->';  $no{'a/aa/nantoka.html'}='<!--3-->';  $no{'b/index.html'}='<!--4-->';  ~ という状態のハッシュを作っています。 while(<>)の<>は、 (ものすごく端折って書くので詳しい事はどこかで調べて下さい) perl test.pl data.csv のような形で実行した場合に、 1回目の<>でdata.csvの1行目を、2回目で2行目を・・・ と、入力行が無くなるまで読んで来てくれるものです。  open CSV,"<data.csv";  while(<CSV>){~}  close CSV; と書くのと動きは同じですね。 この場合は、<>を使ったのは、 書くのが楽だから、というだけの理由です(^^;

lefthand77
質問者

補足

ありがとうございました!! ようやく理解できました。なるほど… そして無事にcsvを読み取ることが出来、エラーも取れて動いた!…のですが… CVS中index.htmlがdisk上に存在しません\n CVS中a/index.htmlがdisk上に存在しません\n CVS中b/index.htmlがdisk上に存在しません\n CVS中以下略 orz csv内に書かれている全てのアドレスで上記の文が発生してしまいました。 もちろん、各htmlにユニークナンバーは挿入されておりません。 …うーん、何か根本的に勘違いしているのでしょうか…? >my $srcpath="/somewhere/src/"; >my $destpath="/somewhere/dest/"; ここが入力と出力…ということだと思いますので、test.plと同階層にそれぞれ/somewhere/src/、/somewhere/dest/とフォルダを作成し(応用力0ですが、間違いないと思いまして) /somewhere/src/上にサイトを丸ごと配置したのですが…そしてそのほかは何も触っておりません。 >foreach my $fn (keys %no){ > print "CVS中 $fn がdisk上に存在しません\n"; >} 結果を見ると、ここに入っているのだとは思うのですが、よく見るとこの箇所、if分などで分岐して来ている訳ではないので、 絶対に通りそうな気がするのですが、そうすると「CVS中~」という分は確実に表示されてしまう、ということでしょうか…? 本当に何度もすみません。 時間の余っているときでかまいませんので、どうか不出来な私に付き合ってやってください…orz

  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.2

番号を各ファイルの一行目に入れる場合の例です。 unixならfindの代わりにopen LS,"ls -1R ~|"したりできますが、 それなら全部シェルで書けそうですし・・・。 perlだけで書くとこんな感じになるかと思います。 (自下げに全角スペースを入れてあるので、コピペする時はご注意を。) ------ use File::Find; use strict; my $srcpath="/somewhere/src/"; my $destpath="/somewhere/dest/"; my %no=(); while(<>){  chop;  my @line=split /,/;  $no{$line[0]}=$line[1]; } find(sub{  my $hkey=substr($File::Find::name,length($srcpath));  my $outfile="$destpath$hkey";  if(-f $_ && /\.html?$/){   if(exists $no{$hkey}){    open IN,$File::Find::name;    open OUT,">$outfile";    print OUT $no{$hkey},"\n";    while(<IN>){ print OUT $_; }    close OUT; close IN;    delete $no{$hkey};   }else{    print "$hkey が CSV中に書かれてないです\n";   }  }elsif(-d $_){   mkdir "$outfile",0775;  } }, $srcpath ); foreach my $fn (keys %no){  print "CVS中 $fn がdisk上に存在しません\n"; }

lefthand77
質問者

補足

ありがとうございました!! …しかし、私のスキル不足(というかすいません、ほぼ初心者状態でして)どのコードがどのような動きを表しているのか、よく分からないところが出てしまいました。 >while(<>){ > chop; > my @line=split /,/; > $no{$line[0]}=$line[1]; >} 具体的には、この部分の動作がイマイチ理解できませんでした… 恐らくはcsv関係のもので、この前段階でcsvファイルを読み込んでこなければならないのだとは思うのですが… そこから下は、照合、埋め込み作業をしているのだという事は分かります(細かい動作までは、少しよく分からないところがあるのですが、大体理解できました) せっかく教えていただいたのに、本当にすみません。 よろしければ、さらに詳しくご教授願えないでしょうか…? よろしくお願いいたします。

  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.1

perlでディレクトリツリーに対して再帰的に処理をするには、 File::Find あたりを使えば良いと思います。 ちょっと使い方が分かりにくいかも知れませんが、 「Perl File Find」で検索すれば いくつか例や解説がヒットすので、大丈夫だと思います。 ただし、、、もしunix環境なら、 シェルスクリプトを使った方が楽かも知れません。 ナンバーを埋め込むという部分については、 やるべき事がちょっと、文面からは読み取れませんでした・・ 上のファイルツリーの話がメインの疑問だと思いますが、 もし埋め込みの方にも疑問があるのであれば、下記を補足願います ・csvファイル内はどういう書式で、csvファイル内の番号を、  どのようにして埋め込みに使うのでしょうか? ・ナンバーを埋め込む先は、ファイル名に、でしょうか?  それともファイルの内容に、でしょうか?

lefthand77
質問者

補足

>perlでディレクトリツリーに対して再帰的に処理をするには、 >File::Find あたりを使えば良いと思います。 File::Findですか・・・ちょ、ちょっと難しそうですが、調べてまいります。 ありがとうございました。 >ナンバーを埋め込むという部分については、 >やるべき事がちょっと、文面からは読み取れませんでした・・ すみません。説明不足でした。 csvの中は下記のような,簡単なものになっております。 index.html,<!--1-->, a/index.html,<!--2-->, a/aa/nantoka.html,<!--3-->, b/index.html,<!--4-->, ~ サイト内の全てのhtmlの場所と、そこに埋め込みたいナンバーが記されています。 ただ、このcsvの内容が実サイトの構造と全く同じかどうか、自信が無いので まず、このcsvと実際のサイト構造が合っているかどうかも調べたいと考えています。 全て一致するかどうか調べたうえで、ナンバーをファイルの中に埋め込みたいのです。 どちらにせよ、まずサイト全体をさらう必要があると考え、このような質問になってしまいました。 分かりにくくてすみません。

関連するQ&A