こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

下記のようなテキストファイルの中から、抽出したい行だけを指定して、取り出す方法はありますでしょうか。

テキストファイルの中身(部分)

<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>があれば、抽出を開始するということができればと
思うのですがよい方法がありましたら、ご教授いただければ幸いです。
よろしくお願いいたします。

投稿日時 - 2013-08-27 23:17:44

QNo.8238640

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2013-08-28 18:41:41

ANo.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

投稿日時 - 2013-08-28 10:31:41

あなたにオススメの質問