dポイントプレゼントキャンペーン実施中!

お世話になります。
いくつかのテキストファイルがあり、それらのファイルのなかの、特定の文字列を含む行をすべて抽出して、別ファイルに集めて保存するようなことを、自動的に行うことはできますでしょうか??
officeソフトでできればよいのですが、ほかの方法でもかまいません。
お願いいたします。

A 回答 (7件)

こんにちは。

KenKen_SP です。

Grep が使えるツールを使うのがベストだと思いますが、なぜ Office でないと
いけないのですか?

という疑問が残りますが...

Excel VBA です。コマンドプロンプト findstr の結果をシートに展開してます。
このマクロが書かれたブックと同一フォルダ内のテキストファイルが対象です。

findstr は簡単な(制限の多い)正規表現が使えるようです。
http://www.atmarkit.co.jp/fwin2k/win2ktips/511fi …

また、VBA ならテキスト全文を読み込んでから VbCrLf で Split して配列にし、
Filter 関数で該当行を抽出する方法でも良いかも。

テストはほとんどしてませんので、エラーがあったら済みません。

Option Explicit

Sub 簡易テキスト検索()
  
  Dim objShell  As Object
  Dim FSO     As Object
  Dim TXT_STREAM As Object
  Dim strKeywrd  As String, strOutput As String
  Dim strFolder  As String, strComand As String
  Dim Buffer   As Variant
  
  Const SEARCH_FILE = "*.txt"
  
  strKeywrd = Application.Trim(InputBox("検索文字を入力します"))
  If strKeywrd = Empty Then
    Exit Sub
  End If
  
  Set objShell = CreateObject("WScript.Shell")
  Set FSO = CreateObject("Scripting.FileSystemObject")

  ' 一時ファイル名生成
  strFolder = ThisWorkbook.Path & "\"
  Do
    strOutput = FSO.BuildPath(strFolder, FSO.GetTempName)
  Loop Until strOutput <> ""
  ' コマンド生成
  strComand = "findstr /r /c:" _
         & Chr(34) & strKeywrd & Chr(34) _
         & " " & Chr(34) & strFolder & SEARCH_FILE & Chr(34) _
         & " > " & Chr(34) & strOutput & Chr(34)
  ' Debug.Print strComand
  ' コマンド実行
  objShell.Run "%ComSpec% /c " & strComand, 0, True
  
  ' コマンド実行で出力されたテキストから読み取る
  If FSO.FileExists(strOutput) Then
    Set TXT_STREAM = FSO.OpenTextFile(strOutput)
    ' 該当なし、または65536以上だとエラーになるのでトラップ
    On Error GoTo ERROR_HANDLER
    Buffer = TXT_STREAM.ReadAll ' <--- Comand Prompt の結果を取得
    ' Excel に転記
    Buffer = Split(Buffer, vbCrLf)
    With ThisWorkbook.Worksheets.Add
      .Range("A1").Resize(UBound(Buffer)).Value = _
      Application.Transpose(Buffer)
    End With
  End If
  
TERMINATE:
  TXT_STREAM.Close
  Kill strOutput ' <----- 一時ファイル削除
  Set TXT_STREAM = Nothing
  Set FSO = Nothing
  Set objShell = Nothing
  Exit Sub
ERROR_HANDLER:
  MsgBox "該当件数が多すぎるか、該当なし", vbInformation
  Resume TERMINATE
End Sub
    • good
    • 0
この回答へのお礼

すばらしいです!Excelでやってみました。

Officeソフトでも、かまわなかったのですが、なにぶん素人さんに使ってもらうことになるので、officeなら、使えるかな。。と思った次第です。


KenKen_SPさんには、以前にもご協力いただきまして、今回もまた、ありがとうございました。助かります。

お礼日時:2006/08/01 15:44

#6 ですが、訂正します。



TERMINATE:
  TXT_STREAM.Close
  Kill strOutput ' <----- 一時ファイル削除

このTERMINATE:ラベル以下2行の位置がよくないので、次の場所に変更します。
すみません。

    Buffer = TXT_STREAM.ReadAll ' <--- Comand Prompt の結果を取得
    
    TXT_STREAM.Close ' <----- ココに移動
    Kill strOutput  ' <----- ココに移動
    
    ' Excel に転記
    Buffer = Split(Buffer, vbCrLf)
    With ThisWorkbook.Worksheets.Add
      .Range("A1").Resize(UBound(Buffer)).Value = _
      Application.Transpose(Buffer)
    End With
    • good
    • 0
この回答へのお礼

なにがよくないのか、よくわからないのですが、、
たびたびすみません。
ありがとうございました。

お礼日時:2006/08/01 15:55

No2です。

とりあえず、ざっとした流れをVBAで書いてみました。 ちょっと時間がないので、詳しく書いていませんが少しでも参考になれば幸いです。

strCheckが特定の文字列
strSourceが検索対象のパス及び、ファイル名
strResultが書き出す別ファイルになります。




Private Sub コマンド0_Click()
Dim strText As String
Dim strCheck As String
Dim strSource As String
Dim strResult As String

strCheck = "foobar"
strSource = "C:\Program Files\Test\testfile.txt"
strResult = "C:\Program Files\Test\output.txt"

'Kill strResult
'killの行は、ファイル消して作り直すためにあります
Open strSource For Input As #1
Open strResult For Append As #2
Do While Not EOF(1)
Line Input #1, strText
If InStr(strText, strCheck) <> 0 Then
Print #2, strText
End If
Loop
Close #1
Close #2
End Sub
    • good
    • 0
この回答へのお礼

お忙しい中、おそれいります。
WORDで試してみたところ、うまくできました!
あとはこれを、GUIでファイル選択や、文字列入力などができれば、最高なのですが。。
またお時間ありましたら、お願いいたします。
ありがとうございました。

お礼日時:2006/08/01 11:40

こんにちわ


以下のようなフリーソフトがあります。
PDFも検索可能ですよ。
http://ohju.cside4.jp/software/kwisp/index.html

参考URL:http://ohju.cside4.jp/software/kwisp/index.html
    • good
    • 0

コマンドラインプロンプトで



findstr /C:"特定文字列" 対象ファイル名 > 出力ファイル名

で可能ですので、これをバッチファイルにすればよいかと。
    • good
    • 0

アクセスやエクセルにデータを読み込んで、そちらで


Instrなどの関数を使って判定、抽出、保存をするというのが手軽です。 

VBAが使えるなら、テキストを一行ずつ読み込み、判定、書き出しが常套手段だと思います。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
やはり、VBAなどでやらないと無理ですか。
VBAの知識がないので、具体的なプログラムを教えていただけたらありがたいのですが。。
よろしくお願いします。

お礼日時:2006/08/01 08:49

秀丸などの、テキストエディタの機能で「grepの実行」が近いかも


しれません。
キーワードを含む行を抽出できますので、それをファイルに保存すれば
いいでしょう。自動化するのであれば、それをuwscなどのキー操作自動化ツールに組み込めば可能です。
もしくは、フリーソフトで、「grep」で検索すれば、お望みのようなツールが入手できるかもしれません。
または、Excelなどのマクロでプログラムする方法もありますが、それなりの知識が必要です。
    • good
    • 1
この回答へのお礼

秀丸は持っていますので、grepでやってみました
あとは、この操作を自動化できれば、望みどおりのものができます。
grepでググって見ようと思います。

お礼日時:2006/08/01 08:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A