• ベストアンサー

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

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

  • Perl
  • 回答数6
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • CSV出力について

    データベースから抽出したデータをカンマ区切りのCSVファイルにしたいと思います。 最終的に sCSVData = "りんご,みかん,オレンジ" のような形式です。 この場合、データにカンマが入ると列がずれてしまいます。 データをクオートすればいいのですが、 sCSVData = replace(sCSVData, ",", """,""") としたのですが、行頭と行末にカンマを入れれません。 どのようなコードを書けばよいのでしょうか。 ご教示よろしくお願いします。

  • ExcelのCSVファイル出力について

    Excelが出力したCSVファイルを扱うプログラムに関する質問です。 Windwosの[コントロールパネル]⇒[地域と言語のオプション]で、 小数点の記号を「.(ピリオド)」から「,(カンマ)」に変更しました。 するとExcelからCSVファイルを出力したときの各データの区切り文字が 「,(カンマ)」から「;(セミコロン)」に変わるようなのですが、 これに対応できるプログラムを作りたいと考えています。 CSVファイルの区切り文字は、Windowsのロケール情報として プログラム上から取得可能なのでしょうか?

  • CSVファイルを読んでシートに書き込む方法

    エクセルのマクロ(VB6.5)でCSVファイルをよんでシートに書き込みたいのですが誰か教えて下さい。 例えば CSVファイルはこんな感じだとします。 ファイルID:test.csv ファイル内容  (1レコード)123,123,123,123,123,123  (2レコード)456,456,456,456,456  (3レコード)789,789,789,789 書き込むシートは「abcシート」とします。 CSVファイルはカンマ区切りですがレコード毎にカンマ区切りのデータ数が違います。 シートには指定したセルに書き込めば一番いいのですが、上から順番に書き込んでもいいです。 申し訳ありませんが、宜しくお願い致します。

  • EXCEL VBAでのCSVファイルの編集

    CSVファイル(ダブルクォーテーション)形式のファイルをEXCEL VBAにて行の編集(削除)をした後、上書き保存をしたらダブルクォーテーション区切りではなくカンマ区切りのCSVファイルの形式になってしまいます。 ダブルクォーテーション区切りのCSVファイルで上書き保存する記述があれば教えて下さい。おそらくEXCELでCSV形式の上書きはCSV2の形式で保存されるみたいです。 困っています。どなたかお助け下さい。

  • CSVファイルの読み込み

    お世話になります。 VBAでCSVファイルを読み込んで処理をしたいのですが、 たとえば下記のようなCSVファイルの場合 2つめの項目が金額セットされており、あらかじめ通貨編集(カンマ編集) がされていて 金額を1つの項目として読み込む事が出来ません。 金額は""でくくってあるのですが、 カンマ区切りのデータと""でくくってあるデータを うまく区別して3つの項目をそれぞれ抽出する事は可能でしょうか? -----以下CSVの内容------ 日付,金額,データ 2007/03/09,"1,200",TEST1 2007/03/09,"12,200",TEST2 2007/03/09,"76,00",TEST3 2007/03/09,"4,5600",TEST4 --------------------------- ちなみに現在はこのようにカンマ区切り指定でデータを抽出してるので うまく出来ません。   'FileNameにはオープンするファイル名がセットされています   Open FileName For Input As   'textlineに1行を読み込む   Line Input #ch1, textline   csvline() = Split(textline, ",") VBAがまだ不慣れな為質問やサンプルが分かりずらいと思いますが よろしくお願いします。

  • CSV出力について

    csvファイルについて質問です。 新しく購入したパソコンでCSVファイルを作成しようとしたら メモ形式でしか表示されません>< 過去に使用していたパソコンでは拡張子をCSVにするだけで カンマ区切りのデータはダブルクリックして開いたら自動的にCSVファイルとして表示されていました。 現状は右クリックでプログラムから開くでエクセルを選ばないといけません。 自動で認識してくれるようにするにはどこで設定したらいいですか?

  • エクセルのカンマ区切りのCSV出力

    エクセルのカンマ区切りのCSV出力について質問します。 CSVファイルとしてカンマ区切りで出力したいのですが、さらに各項目にダブルコーテーション(")をつけて出力したいのです。 例) 通常のCSV 01,02,03 やりたいCSV出力 "01","02","03" ご存知の方がいらっしゃいましたら回答お願いします。

  • 複数のCSVファイルを一つのCSVファイルに

    ディレクトリ内に複数あるCSVファイルを一つのCSVにまとめたいのですが、方法がわからないので教えて下さい。 ファイルの読み出しと追加書き込みを繰り返せば良いとは思っています。 ディレクトリ内のファイルを検索するところまでは出来ました。

    • ベストアンサー
    • Perl
  • CSVファイルで出力した時

    家計簿サイトからCSVファイルとしてデータを出力したのですが、日付の欄が#####と表示されてしまいます。 そのセルをダブルクリックすると日付に戻るのですが、その後保存しようとしても、「CSV(カンマ区切り)と互換性のない機能が含まれている可能性があります」と表示され、保存できません。 どうすれば日付を#じゃないように表示できるのでしょうか?

  • カンマ区切りCSVファイルをVBAで読み込みたい

    こんにちは。EXCELのVBAに詳しい方、どうか教えてください! カンマ区切りCSVファイルをEXCELに読み込みたいのですが、 CSVファイルのデータが金額のため、データ自体にもカンマが含まれていて、 金額のカンマでも分割されてEXCELのセルに収まってしまいます。 データの区切りのカンマと、金額のカンマを区別して読み込む良い方法はないでしょうか。 とても困っているので、お解りになる方どうかご回答をお願いいたします。 ・CSVファイルのデータ   1,000 , 2,000 , 1,500 , 3,000 , 1,000 , 2,500 , 2,000  ↑金額のカンマでデータが分割されないように読み込みたいのですが・・・

専門家に質問してみよう