• ベストアンサー

ある文字列を含む行の抽出

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

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

こんにちは。KenKen_SP です。 Grep が使えるツールを使うのがベストだと思いますが、なぜ Office でないと いけないのですか? という疑問が残りますが... Excel VBA です。コマンドプロンプト findstr の結果をシートに展開してます。 このマクロが書かれたブックと同一フォルダ内のテキストファイルが対象です。 findstr は簡単な(制限の多い)正規表現が使えるようです。 http://www.atmarkit.co.jp/fwin2k/win2ktips/511findstr/findstr.html また、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

coral_japan
質問者

お礼

すばらしいです!Excelでやってみました。 Officeソフトでも、かまわなかったのですが、なにぶん素人さんに使ってもらうことになるので、officeなら、使えるかな。。と思った次第です。 KenKen_SPさんには、以前にもご協力いただきまして、今回もまた、ありがとうございました。助かります。

その他の回答 (6)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.7

#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

coral_japan
質問者

お礼

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

noname#60992
noname#60992
回答No.5

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

coral_japan
質問者

お礼

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

回答No.4

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

参考URL:
http://ohju.cside4.jp/software/kwisp/index.html
  • ppg-2
  • ベストアンサー率39% (77/193)
回答No.3

コマンドラインプロンプトで findstr /C:"特定文字列" 対象ファイル名 > 出力ファイル名 で可能ですので、これをバッチファイルにすればよいかと。

noname#60992
noname#60992
回答No.2

アクセスやエクセルにデータを読み込んで、そちらで Instrなどの関数を使って判定、抽出、保存をするというのが手軽です。  VBAが使えるなら、テキストを一行ずつ読み込み、判定、書き出しが常套手段だと思います。

coral_japan
質問者

お礼

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

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

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

coral_japan
質問者

お礼

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

関連するQ&A