- ベストアンサー
ある文字列を含む行の抽出
お世話になります。 いくつかのテキストファイルがあり、それらのファイルのなかの、特定の文字列を含む行をすべて抽出して、別ファイルに集めて保存するようなことを、自動的に行うことはできますでしょうか?? officeソフトでできればよいのですが、ほかの方法でもかまいません。 お願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。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
その他の回答 (6)
- KenKen_SP
- ベストアンサー率62% (785/1258)
#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
お礼
なにがよくないのか、よくわからないのですが、、 たびたびすみません。 ありがとうございました。
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
お礼
お忙しい中、おそれいります。 WORDで試してみたところ、うまくできました! あとはこれを、GUIでファイル選択や、文字列入力などができれば、最高なのですが。。 またお時間ありましたら、お願いいたします。 ありがとうございました。
- shiroshi_1970
- ベストアンサー率50% (3/6)
こんにちわ 以下のようなフリーソフトがあります。 PDFも検索可能ですよ。 http://ohju.cside4.jp/software/kwisp/index.html
- ppg-2
- ベストアンサー率39% (77/193)
コマンドラインプロンプトで findstr /C:"特定文字列" 対象ファイル名 > 出力ファイル名 で可能ですので、これをバッチファイルにすればよいかと。
アクセスやエクセルにデータを読み込んで、そちらで Instrなどの関数を使って判定、抽出、保存をするというのが手軽です。 VBAが使えるなら、テキストを一行ずつ読み込み、判定、書き出しが常套手段だと思います。
お礼
アドバイスありがとうございます。 やはり、VBAなどでやらないと無理ですか。 VBAの知識がないので、具体的なプログラムを教えていただけたらありがたいのですが。。 よろしくお願いします。
- kokorone
- ベストアンサー率38% (417/1093)
秀丸などの、テキストエディタの機能で「grepの実行」が近いかも しれません。 キーワードを含む行を抽出できますので、それをファイルに保存すれば いいでしょう。自動化するのであれば、それをuwscなどのキー操作自動化ツールに組み込めば可能です。 もしくは、フリーソフトで、「grep」で検索すれば、お望みのようなツールが入手できるかもしれません。 または、Excelなどのマクロでプログラムする方法もありますが、それなりの知識が必要です。
お礼
秀丸は持っていますので、grepでやってみました あとは、この操作を自動化できれば、望みどおりのものができます。 grepでググって見ようと思います。
お礼
すばらしいです!Excelでやってみました。 Officeソフトでも、かまわなかったのですが、なにぶん素人さんに使ってもらうことになるので、officeなら、使えるかな。。と思った次第です。 KenKen_SPさんには、以前にもご協力いただきまして、今回もまた、ありがとうございました。助かります。