人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

★文字列判別&抽出プログラム★
■採用回答に 500 pt 程度■

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

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

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

●質問者: にぎたま
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ABC HTML PT XYZ コメント
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● niwa-mikiho
●35ポイント

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);





これでどうでしょう?

◎質問者からの返答

ありがとうございます。

これはperlですか?

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

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


2 ● airplant
●35ポイント

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

下記でできると思います。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で出すなどの変更を加えると更に使いやすいかも知れません。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ