★文字列判別&抽出プログラム★

■採用回答に 500 pt 程度■

「abc」というフォルダに100個のhtmlファイルがあります。
以下の動作を自動で実現する方法/ソフト/プログラムを教えてください。

「abc」フォルダ内のhtmlファイルを1つ開く
最初の行からファイル末尾の行までの各行(論理行=改行から改行まで)を1行つずつ調べて全角文字が1つでも含まれている行があるかチェックする。
全角文字が含まれている行が見つかった場合、その行まるごと(改行から改行まで)を削除する(削除後は空行になる)。
その時チェック中の(開いている)htmlファイルと同じファイル名のファイルを「xyz」というフォルダに作成して、削除した行の内容を丸ごと(改行から改行まで)そのファイルに出力する。
ファイル末尾の行までチェックしたら出力ファイルを保存して閉じる
次のhtmlファイルを開く・・・(繰り返し)

質問登録から1時間後くらいに補足情報と具体例をコメントに書きます。
質問はコメントにどうぞ

回答の条件
  • 1人1回まで
  • 登録:2009/03/03 22:42:02
  • 終了:2009/03/10 22:45:04

回答(2件)

id:niwa-mikiho No.1

niwa-mikiho回答回数508ベストアンサー獲得回数382009/03/04 00:51:43

ポイント35pt

use strict;

opendir(DIR, "./abc");

while(my $file = readdir(DIR)){

next if -d $file;

next if $file !~ /\.html$|\.htm$/i;

open(INFH, '<', "./abc/$file");

my $inputfile = '';

my $outputfile = '';

while(my $line = <INFH>){

# Shift_JIS 全角チェック

if($line =~ /[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]/i){

$outputfile .= $line;

$line = "\n";

}

$inputfile .= $line;

}

close(INFH);

if($outputfile){

open(OUTFH, '>', "./xyz/$file");

print OUTFH $outputfile;

close(OUTFH);

open(OUTFH, '>', "./abc/$file");

print OUTFH $inputfile;

close(OUTFH);

}

}

closedir(DIR);





これでどうでしょう?

id:Nigitama

ありがとうございます。

これはperlですか?

すみませんが実行方法を教えてもらえないでしょうか?

ちなみにローカルで作業をしたいと思っています。Apacheなどのインストールは避けたいと思っています。

2009/03/04 01:11:09
id:airplant No.2

airplant回答回数220ベストアンサー獲得回数492009/03/04 03:22:02

ポイント35pt

何度も同じ回答者ですみません。

下記でできると思います。WSHにしたかったのですが、全角判定が一発でできないので、Excelマクロにしました(VBでも動くと思います)。

Option Explicit

Const sInPath = "C:\temp\abc\"
Const sOutPath = "C:\temp\xyz\"
Const sTmpFile = "C:\temp\abc\temp.txt"
'Const ForWriting = 2 'FSO

Sub getKanjiLine()
        
    Dim sInName As String   'フォルダ含まない名前
    Dim sInFile As String
    Dim sOutFile As String
    Dim sTextLine As String
    
    '出力ファイル用にのみFSOを利用(printが化けるため)
    Dim oFSO As Object
    Dim oOutTextStrm As Object
    
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    sInName = Dir(sInPath & "*.html") '最初のファイル名を持ってくる
    Do While sInName <> ""
        
        sInFile = sInPath & sInName
        sOutFile = sOutPath & sInName
        Open sInFile For Input As #1
        Set oOutTextStrm = oFSO.CreateTextFile(sOutFile, True)
        With oFSO.CreateTextFile(sTmpFile, True) '入力ファイル更新用
            Do While Not EOF(1)
                Line Input #1, sTextLine
                '全角の有無判定
                If Len(sTextLine) <> _
                  LenB(StrConv(sTextLine, vbFromUnicode)) Then
                    .WriteLine  '入力ファイルを改行にする
                    oOutTextStrm.WriteLine (sTextLine)  '日本語行は、別に出力
                Else
                    .WriteLine (sTextLine)
                End If
            Loop
            '日本語行がないなら出力は消す →お好みでCloseのみにしてください
            If oOutTextStrm.Line = 1 Then
                oOutTextStrm.Close
                Kill sOutFile
            Else
                oOutTextStrm.Close
            End If
            .Close
            Close #1
            '作業ファイルを元のファイルに上書き
            FileCopy sTmpFile, sInFile
            Kill sTmpFile
        End With
        sInName = Dir
    Loop
End Sub

行番号をつけたり、xyzへ出す日本語分ファイルは.txtで出すなどの変更を加えると更に使いやすいかも知れません。

  • id:Nigitama
    たとえば

    「abc」フォルダにあるhogehoge.htmlの内容が以下の内容であった場合
    -------------------------------
    <html>
    <head>
    <title>ページタイトル</title>
    </head>
    <body>
    <div>hogehoge</div>
    <div>fooです。</div>
    </body>
    </html>
    -------------------------------

    「abc」フォルダにある処理後のhogehoge.htmlは次のように変更されます。
    -------------------------------
    <html>
    <head>

    </head>
    <body>
    <div>hogehoge</div>

    </body>
    </html>
    -------------------------------

    そして「xyz」フォルダには新たにhogehoge.htmlが作成され、内容は次のようになります。
    -------------------------------
    <title>ページタイトル</title>
    <div>fooです。</div>
    -------------------------------

    採用回答が早めに出た場合は最大で +500pt つまり、合計で最大 1000 pt まで出します。
  • id:kn1967
    動作環境や、テキストの文字コードなどは必須情報だと思いますよ。

    専用のソフトがなくても、
    その程度のことならばテキスト処理スクリプト使えば簡単だったりするし
    例えば
    WindowsであればVBScriptなんかが使えるし、ExcelVBAなどでも良いし・・・
    MacOSXやLinuxならperlとか使えるし、grepなんて外部コマンドもあったりするし・・・
  • id:kn1967
    http://q.hatena.ne.jp/1235641852#a898818 と同じ環境なら、
    頂戴したスクリプトを少し改造するだけだったりするけど・・・。
    (文字を数えるか、抜き出すかの違いだけ・・・)

    動作テストする環境が今無いから、誰か他の人に期待ですけどね・・・。
  • id:Nigitama
    うっかりしていました。すいません。
    Win XP Home, Word 2003, Excel 2003 です。

    対象となる html ファイルの文字コードは S-JIS です。出力先の文字コードはなんでもいいですが、そろえて S-JIS にしたいと思います。
    プログラムには疎いので、こうしたスクリプトを教えていただける救世主をお待ちしています。
  • id:Reiaru
    Copal 2 (Perl エミュレーター)
    http://homepage1.nifty.com/kaityo/copalpro/

    最初の回答者である niwa-mikiho 様の Perl ソースコードですが、
    こちらのソフトを利用する事でローカル PC 内でも動作させる事ができる様です。

    ソースコードを貼り付けて実行ボタンを押すだけです。

    詳しく検証はしておりませんが、さらっと実験してみた限りではローカルで問題無く動作しております。
    無論、Apache や Active Perl といった物のインストールも必要ありませんし、
    単純にアーカイブを展開して実行するだけです。

    ローカルで Perl を動作させるには AN HTTP などを使用しないと無理だと思っておりましたが、
    こんな便利なソフトもあるのですね。
  • id:kn1967
    Reiaru 2009-03-04 04:11:48>Copal 2 (Perl エミュレーター)
    Reiaru 2009-03-04 04:11:48>http://homepage1.nifty.com/kaityo/copalpro/
    Reiaru 2009-03-04 04:11:48>Apache や Active Perl といった物のインストールも必要ありませんし

    それはエディタですよ。エディタの動作確認だけしてませんか?
    perlなどは別途インストールが必要です。

    http://homepage1.nifty.com/kaityo/copalpro/copalpro.html#HLP000002
    -----引用ここから
    Copalはインタプリタ、つまりプログラムを自分で解釈して実行する能力は持っておりません。
    あくまでスクリプトを実行するのはPerlやAWKなどのプログラムです。
    Copalの仕事は、スクリプトをこれらのプログラムに渡し、結果やエラーメッセージを取得することだけです。
    -----引用ここまで

    Reiaru 2009-03-04 04:11:48>ローカルで Perl を動作させるには AN HTTP などを使用しないと無理だと思っておりましたが、
    Reiaru 2009-03-04 04:11:48>こんな便利なソフトもあるのですね。

    perlはwebサーバで使うものとしての知名度が高いのですが
    テキスト処理スクリプトですから、サーバソフトの有無は関係ありません。
    WindowsであればActive Perlだけをインストールすれば
    コマンドラインから操作できます。
  • id:Reiaru
    そうなのですか?

    SET PATH=C:\Perl\site\bin;C:\Perl\bin;%PATH%

    動作したのは私が Perl をローカル PC に入れているからなのですね?
  • id:kn1967
    >私が Perl をローカル PC に入れているから

    そうです。
  • id:niwa-mikiho
    最初に回答したのは Perl のスクリプトです。

    CGI でも使われていますが、Apache などの WEB サーバーをインストールしなくても
    実行できます。

    新しいバージョンです
    http://downloads.activestate.com/ActivePerl/Windows/5.10/ActivePerl-5.10.0.1004-MSWin32-x86-287188.msi


    Bat ファイルの代わりみたいにも使えるので、入れておいても損はないソフトだと思います。
  • id:Nigitama
    申し訳ありません!
    うっかりしていたら終了してしまいました!

    先ほどniwa-mikihoさんとairplantさんに700ptずつ送信しました。
    ご確認ください。
  • id:airplant
    たくさんのポイントありがとうございました。
    perlのほうがスマートですね。

この質問への反応(ブックマークコメント)

トラックバック

  • 永字八法 - 頭の体操 2009-03-05 19:03:49
    頭の体操 ★文字列判別&抽出プログラム★ ■採用回答に 500 pt 程度■ 「abc」というフォルダに100個のhtmlファイルがあります。 以下の動作を自動で実現する方法/ソフト/プログラ.. - 人力検
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません