• 締切済み

テキストファイルから、一部の行を抽出したい

下記のようなテキストファイルの中から、抽出したい行だけを指定して、取り出す方法はありますでしょうか。 テキストファイルの中身(部分) <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>があれば、抽出を開始するということができればと 思うのですがよい方法がありましたら、ご教授いただければ幸いです。 よろしくお願いいたします。

みんなの回答

回答No.2

質問で書かれている内容を見ると ・タグで囲まれた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)
回答No.1

こんな感じでどうでしょうか。 エクセルのマクロとして書きました。 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

関連するQ&A