• ベストアンサー

指定ファイル内の一部内容を抽出してCSV出力したい

aa.csv → 複数の「ID」「htmlファイルの保存ディレクトリ」がカンマ区切りで記述されたCSV bb.csv → 複数の「ID」「抽出したHTMLソース(「BODY」「/body」は含まない) aa.csvに記述されたディレクトリ毎にhtmlファイルを開き、その中にある「body」~「/BODY」内の内容を抽出し、bb.csvに記述したいと考えています。 EXCELVBAで行なおうと試行錯誤したのですが、うまくいきません・・。 Perlなどを使用すれば可能と聞いたのですが、私のレベルだとうまく動作してくれず、大変困っています。 どなたか、アドバイス等を頂けないでしょうか。 どうぞ、よろしくお願いします。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

いろいろ書いたけど結局のところ「ファイル全体を読み込んでからパターンマッチング」でいけるはず. だから $/ = undef; my $line = <>; my ($contents) = ($line =~ m!<BODY.*?>(.*?)</BODY>!i); $contents =~ tr/\n//; あたりでいいような気はするけど, 複数行のマッチングはやったことないから不安. m とか s とかのオプションは必要だったっけ....

er4g56ge
質問者

お礼

無知識の私に何度も親切にアドバイスいただき、本当に感謝してます。 早速、アドバイスいただいた内容を参考に作成したいと思います。 本来なら「おかげで動作しました!」とお答えしたいのですが、まだ、完成には時間が必要のようです。 でも、悩んでいた個所は、ご指摘いただいたおかげでクリアできそうです。 本当に有難うございました。

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

えぇっと, 例えば「ある文字列から最後の改行を取り除く」とか, 「配列に入っている複数の文字列を 1つにまとめる」とか, そういうことはできますか?

er4g56ge
質問者

補足

ご回答ありがとうございます。遅くなってすみません。 「ある文字列から最後の改行を取り除く」「配列に入っている複数の文字列を 1つにまとめる」なら、私にもできると思います。 指定したディレクトリ先のHTML内の「body~body」内を配列に抽出するといった所を教えてもらえると助かります。 よろしくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

えぇと, 「複数の BODY 要素」があるとして, それをどのように出力したいんでしょうか? ついでにいうと, 1個の BODY 要素であっても複数行からなる可能性があるんですがそれもどうしましょうか? つまり, <body> あれ それ </body> <body> 2つ目の BODY要素 </body> となっているときに, どのように出力したいんでしょうか? BODY 要素の中を取り出すという処理はソースの複雑さによっていろいろですが, 例えば「BODY タグや /BODY タグはそれだけで1行である」ということが保証できるなら my $in_body; my @body_content; while (<>) { if ($in_body) { if (m!</body>!i) { $in_body = 0; } else { push @body_contents, $_; } elsif (m!<body>!i) { $in_body = 1; } } くらいでもできます.

er4g56ge
質問者

補足

アドバイスありがとうございます。 ご指摘内容について補足させていただきます。 まず、ひとつ訂正があります。 sample.html内を調べたのですが、body要素は複数ないようです。 すみません・・。 また、私が行いたい手順は、 (1)抽出したBODY内のデータをCSV形式で出力する。 (2)出力したCSVをDBにインポート (3)PHPを使って、私の作成したHTML(php)のBODY内の指定箇所に貼り付ける・・というイメージです。ヘッダー等は私が作成したソースを使用する予定でして、その途中箇所に貼り付けたいと・・。 ですので、抽出したbody要素内テキストを、 "(商品番号)"、"(body要素内のデータ)" のCSVとして出力したいのです。 body内は複数行ありますが、(CSVとして抽出するために)改行を外したい(改行をnullに置換したい)と考えています。 何度もすみません。 どうぞ宜しくお願いいたします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

おおまかな流れは 1. 与えられた CSV ファイルから「商品番号」を取り出す. 2. 商品番号から適切な HTML を見付けてオープンする. 3. その中から BODY 要素の内容を出力する. という感じになるでしょうか. とりあえず ・CSV ファイルにおいて「商品番号」はどの列にあるのか (←これがわからないと取り出しようがない) ・ディレクトリ名や HTML ファイルの名前はどのような規則になっているのか (←上位ディレクトリが「商品番号の下位 3桁」, 下位ディレクトリが「商品番号の残りの部分」であって, HTML のファイル名は常に sample.htmlなのか, など) ・BODY 要素が複数行の場合にどのように出力するのか あたりが決まれば, なんとなく書けるかな.

er4g56ge
質問者

補足

早速の回答有難うございます! 「流れ」については、まさにおっしゃる通りです。 ・既存のCSVファイルには「13桁の商品番号」のみが改行区切りで入っています。 ・ディレクトリ構成は統一されていまして、(おっしゃる通り)「商品番号下位3桁」のフォルダの下に「商品番号上位10桁」フォルダがあります。さらにその下にsample.htmlというファイルがあり、HTMLファイル名は全て同じファイル名です。 ・body要素が複数ある可能性はあります。(大量にあるため確認できていませんが)複数ある場合でも、全てのbody要素を抽出したいです。 特に「ファイル内の指定した箇所を抽出する」というのがイメージできなくて困っています。 アドバイスいただければ幸いです。 どうぞよろしくお願いいたします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

そもそも入出力の関係がよくわからんのだけど.... ディレクトリ構造とか, ファイルの中身がどうなっているかとか, どういう出力をしたいのかとか, もうちょっと詳しく書いてもらえますか?

er4g56ge
質問者

補足

ご回答下さり、本当にありがとうございます。 私のレベルだと行き詰ってしまい、困っていました。 確かに説明不足でしたよね。 (1)商品番号「1234567890(例)」が並んだcsvファイルがあります。 (2)階層ディレクトリは、 フォルダ「890」-フォルダ「1234567」の下にsample.htmlというのがあります。このsample.htmlソースの一部を抜き出したいんです。 (3)抜き出したソースと商品番号をDBに登録したいんです。 一番したいことはsample.htmlの中身をDBに登録することです。そのために、一度HTMLソースをcsvとして出力したいと考えています。DBには 商品番号,HTMLソースの2フィールドをテーブル登録したいと考えています。 商品番号のリストはCSV形式ファイルとして既にありますので、そこの「商品番号」から該当ディレクトリを探し出してhtmlソースを抜き出すperlを作れないかなと考えているのですが、そもそも、そんな事ができるかも分かっていません。 EXCELのVBAをかじった程度ですので、説明がうまく出来くてすみません。perlについては全くの初心者でして、配列などは理解できるのですが、ファイルの中身の一部だけを抜き出すというプログラムがイメージできないんです。 せめて、考え方だけでも教えていただけると助かります。 どうぞ、よろしくお願いします。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

とりあえず自分でここまでやりましたというスクリプトを晒すとアドバイスがもらいやすくなると思います。 でなければ丸投げと大差ないレベルの質問です。

er4g56ge
質問者

補足

おっしゃる通りだと思います。すみません。 ただ、基本的なことが分からなくて困っています。せめて、考え方だけでもアドバイスしていただければと思って投稿しました。

関連するQ&A