- 締切済み
テキストファイルから、一部の行を抽出したい
下記のようなテキストファイルの中から、抽出したい行だけを指定して、取り出す方法はありますでしょうか。 テキストファイルの中身(部分) <h3 align="center">顧客名1</h3> <table><tr><td>ABC商事</td><td>鹿児島県</td></tr></table> <h3 align="center">顧客名2</h3> <p>出版</p> <br> <table> <tr><td>A株式会社</td><td>宮崎県</td></tr> ←抽出したい行 <tr><td>bb株式会社</td><td>長崎県</td></tr> ←抽出したい行 </table> <p>教育</p> <br> <table> <tr><td>TT株式会社</td><td>鹿児島県</td></tr> ←抽出したい行 <tr><td>W株式会社</td><td>東京都</td></tr> ←抽出したい行 </table> <p>マスコミ<p> 以下省略 実際には、ファイルが大きく、抽出したい行が多いため、自動で処理できればと考えております。 VBAで作成できればと思っています。 <h3 align="center">顧客名2</h3> のあとに、<table>があれば、抽出を開始し、 </table> で、抽出をやめる、 また、<table>があれば、抽出を開始するということができればと 思うのですがよい方法がありましたら、ご教授いただければ幸いです。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
質問で書かれている内容を見ると ・タグで囲まれたHTML形式のマークアップ という事なので 「行」という考えは「テキストの行」ではなく「TableRow」の行という考えですよね? TableRowのROWタグの内部の文字列化された情報が、1行に収まっているという前提があるのであれば、容易に判定が出来ると思いますが、情報が複数行にまたがるのであれば、テキスト化された文字列から「正規表現」でROWタグを探してウニャラウニャラと。。。。 となると思います。 しかし「Microsoft HTML Object Library」というライブラリを参照設定に加え使用すると、解析を楽に行うことが出来ます。 以前にVB.NET版でサンプルを載せました。 http://okwave.jp/qa/q5888958.html それを改造したVBA版を載せておきます。 Option Explicit '起動メイン Sub Test() 'ファイルを読込 'テキストファイルにはHTML形式のBODYの中だけが記されているとする Dim l_strBuff As String l_strBuff = ファイル読込("c:\testdata.txt") '取得した内容を解析 Call 解析(l_strBuff) End Sub '文字列解析サンプル Private Sub 解析(ByVal p_strBuff As String) Dim l_htmDoc As New MSHTML.HTMLDocument Call l_htmDoc.Open("<html />") '引数の文字列は<BODY>~</BODY>のinnerHTMLのみなので 'ダミーのDIVタグを作成し、その中に引数の文字列を埋め込む ' 'もし<HTML>~</HTML>で文字列を取得できるのであれば、 'l_htmDoc変数から直接オープンを行いl_htmDoc変数のbodyプロパティ配下を '解析したらよいので、ダミーのDIVタグは不要となる Dim l_htmDiv As MSHTML.HTMLDivElement Set l_htmDiv = l_htmDoc.createElement("DIV") Call l_htmDoc.appendChild(l_htmDiv) l_htmDiv.innerHTML = p_strBuff 'TABLEタグに限定し、解析開始 'l_htmDiv.childrenでループを行うと、TOPクラスの全てのタグを取得することも出来る Dim l_htmTbl As HTMLTable For Each l_htmTbl In l_htmDiv.getElementsByTagName("table") Debug.Print String(10, "*") & " テーブル開始 " & String(10, "*") Dim l_lngRowID As Long For l_lngRowID = 1 To l_htmTbl.Rows.Length Dim l_htmRow As HTMLTableRow Debug.Print "※ " & l_lngRowID & "列目" & " ※" Set l_htmRow = l_htmTbl.Rows(l_lngRowID - 1) '<TR>タグから出力 Debug.Print l_htmRow.outerHTML '<TR>タグが不要であれば 'Debug.Print l_htmRow.innerHTML Next l_lngRowID Debug.Print String(10, "*") & " テーブル終了 " & String(10, "*") Next l_htmTbl End Sub 'ファイル一括読込サンプル Private Function ファイル読込(ByVal p_strFilePath As String) As String Dim l_strRet As String Dim l_fsoObj As Object 'Scripting.FileSystemObject Dim l_fsoFile As Object 'Scripting.File Dim l_fsoSr As Object 'Scripting.TextStream Set l_fsoObj = CreateObject("Scripting.FileSystemObject") Set l_fsoFile = l_fsoObj.GetFile(p_strFilePath) Set l_fsoSr = l_fsoFile.OpenAsTextStream(1) l_strRet = l_fsoSr.ReadAll l_fsoSr.Close ファイル読込 = l_strRet End Function
- MSZ006
- ベストアンサー率38% (390/1011)
こんな感じでどうでしょうか。 エクセルのマクロとして書きました。 O_data.txtに該当行を書き出しています。 入力ファイル(Data.txt)はエクセルブックと同じフォルダに入れてください。 ----------------- Sub test() Dim buf As String Dim str1 As String Dim str2 As String Dim str3 As String Dim sw As Long Dim st As Long str1 = "<h3 align=""center"">顧客名2</h3>" str2 = "<table>" str3 = "</table>" sw = 0 st = 0 Open ThisWorkbook.Path & "\Data.txt" For Input As #1 Open ThisWorkbook.Path & "\O_data.txt" For Output As #2 Do Until EOF(1) Line Input #1, buf If InStr(buf, str1) > 0 Then sw = 1 GoTo continuelabel End If If InStr(buf, str2) > 0 And sw = 1 Then st = 1 GoTo continuelabel End If If InStr(buf, str3) > 0 And sw = 1 Then st = 0 GoTo continuelabel End If If sw = 1 And st = 1 Then Print #2, buf End If continuelabel: Loop Close #1 Close #2 End Sub