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

解決済みの質問

VB.NETでテキストファイルからHTMLファイルを動的に生成したいの

VB.NETでテキストファイルからHTMLファイルを動的に生成したいのですがどのようにやればできるかヒントをいただけないでしょうか?
とあるフォルダに下記のようなファイルがあるとします。
20100101AAA.txt
20091008AAA.txt
20100202AAA.txt
20070707AAA.txt
20100412AAA.txt
また、ファイルの中身は
<div id = 'AAA'>それぞれのファイルの内容</div>
<div id = 'BBB'>それぞれのファイルの内容</div>
です。
まず、ファイル名から日付を解析して新しい順番に並べるアルゴリズムを考えたいのですがどのようにしたらいいか困っています。
また、並び変えたファイルを動的に合成して一つのHTMLを作りたいのですがどのようにしたらいいのでしょうか?
詳しい方よろしくお願いします。

投稿日時 - 2010-04-12 00:00:20

QNo.5819786

すぐに回答ほしいです

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

後半

  Private Sub OutPutHtmlExec(ByVal p_strHtm As String, ByVal p_htmHtml As HtmlGenericControl, ByVal p_enc As Encoding)
    Dim l_strRet As String = ""

    Using l_fsOut As New System.IO.FileStream(p_strHtm, FileMode.Create)
      Using l_hwHtm As New System.Web.UI.HtmlTextWriter(New System.IO.StreamWriter(l_fsOut, p_enc))

        p_htmHtml.RenderControl(l_hwHtm)
        l_hwHtm.Flush()
      End Using
    End Using
  End Sub

  Private Function ReadTextSJIS(ByVal p_fInf As FileInfo) As String
    Return System.IO.File.ReadAllText(p_fInf.FullName, Encoding.GetEncoding("shift_jis"))
  End Function

  Private Function FindText(ByVal p_strPath As String, ByVal p_strPtn As String) As DataTable
    Dim l_dtbRet As DataTable = FindTextSchema()
    Dim l_dInf As New DirectoryInfo(p_strPath)
    For Each l_fInf As FileInfo In l_dInf.GetFiles(p_strPtn)
      Dim l_drwWk As DataRow = l_dtbRet.NewRow()
      l_drwWk("path") = l_fInf.FullName
      l_drwWk("date") = DateTime.ParseExact(l_fInf.Name.Substring(0, 8), "yyyyMMdd", Nothing)
      l_dtbRet.Rows.Add(l_drwWk)
    Next
    Return l_dtbRet
  End Function

  Private Function FindTextSchema() As DataTable
    Dim l_dtbRet As New DataTable
    l_dtbRet.Columns.Add(New DataColumn("path", GetType(String)))
    l_dtbRet.Columns.Add(New DataColumn("date", GetType(Date)))
    Return l_dtbRet
  End Function
End Class

投稿日時 - 2010-04-12 10:51:11

お礼

ありがとうございます
知らない方法とかもあり勉強しながらですが頑張ってみたいと思います。
参考にします!

投稿日時 - 2010-04-15 22:02:12

ANo.4

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

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

回答(7)

ANo.7

通るすがるです。すいません。no5,6は別の回答でした。
忘れてください。

投稿日時 - 2010-04-14 19:37:34

お礼

ありがとうございました

投稿日時 - 2010-10-23 18:49:21

ANo.6

通るすがるです。
先ほどの回答の続きです。

 空白をとる場合、=value(XX)の関数を以下の内容に置き換えてみてください。


 =IF(ISERR(VALUE(SUBSTITUTE(A1," ","")))=TRUE,0,VALUE(SUBSTITUTE(A1," ","")))

投稿日時 - 2010-04-14 16:22:36

お礼

ありがとうございました

投稿日時 - 2010-10-23 18:49:32

ANo.5

通るしがるです。

=VALUE(xx)で、エラーになるということは、おそらすxxに示した値が
数字として変換できない値を含んでいることが考えられます。
たとえば、”4△4"とか、そのような値(例では△(空白)を取り除いて
再度、value関数で数値変換してみてください。

投稿日時 - 2010-04-14 16:07:06

お礼

ありがとうございました

投稿日時 - 2010-10-23 18:49:44

ANo.3

前半

Imports System.IO
Imports System.IO.Path
Imports System.Text
Imports System.Web.UI.HtmlControls '←要参照設定[System.Web]

Public Class Form1
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    '出力対象情報を取得([探す場所],[検索パターン])
    Dim l_dtbData As DataTable = FindText("C:\testdata", "*AAA.txt")

    'HTML出力([出力ファイル名],[出力対象情報])
    Call OutPutHtml("C:\test.html", l_dtbData)
  End Sub

  Private Sub OutPutHtml(ByVal p_strHtm As String, ByVal p_dtbData As DataTable)

    'エンコード
    Dim l_enc As Encoding = Encoding.UTF8

    Using l_htmHtml As New HtmlGenericControl("html")
      'ヘッダ
      Using l_htmHead As New HtmlGenericControl("Head")
        l_htmHtml.Controls.Add(l_htmHead)
        'エンコード情報の追加
        Using l_htmMetaEnc As New HtmlMeta
          l_htmHead.Controls.Add(l_htmMetaEnc)
          With l_htmMetaEnc
            .HttpEquiv = "Content-Type"
            .Content = "text/html"
            .Attributes("charset") = l_enc.WebName
          End With
        End Using
        'タイトル追加
        Using l_htmTitle As New HtmlTitle
          l_htmHead.Controls.Add(l_htmTitle)
          l_htmTitle.Text = "あうとぷっと"
        End Using
      End Using

      'ぼでー
      Using l_htmBody As New HtmlGenericControl("body")
        l_htmHtml.Controls.Add(l_htmBody)

        '日付順にソート取得
        For Each l_drwWk As DataRow In p_dtbData.Select(Nothing, "date")
          Dim l_fInf As New FileInfo(l_drwWk("path").ToString())

          'DIV作成
          Using l_htmDiv As New HtmlGenericControl("div")
            l_htmBody.Controls.Add(l_htmDiv)

            With l_htmDiv
              .ID = "div" & l_fInf.Name
              'そのままテキストを出力
              .InnerText = ReadTextSJIS(l_fInf)
              '改行を置き換える
              .InnerHtml = .InnerHtml.Replace(vbCrLf, "<br />")
            End With
          End Using
        Next
      End Using

      'HTML出力実行
      Call OutPutHtmlExec(p_strHtm, l_htmHtml, l_enc)
    End Using
  End Sub

投稿日時 - 2010-04-12 10:49:18

お礼

ありがとうございました

投稿日時 - 2010-10-23 18:50:03

ANo.2

はじめまして、通るがると申します。
さて、ご質問の件なのですが、まずファイル名から日付を解析とありますが
日付がユニークであるならば、日付のみ抽出するのでなくファイル名そのものをソートすれば
よいことになりますので、ArrayクラスのSortメソッドでいけると思います。
もし、ソートをオリジナルのソートロジックで実施しなければならないのであれば、
ソート方法として色々と考えかたがありますのでそちらを参照してください。
 http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/

ファイル名の取得、htmlの作成(合成)についてなのですが、別にhtmlだからといって
特別な操作をするわけではありません。txtもhtml,csvとかもvbからみれば
ただのテキストファイルです。
複数のファイルから一つのファイルに結合したいのであれば、全ファイルをメモリに読み込み
メモリ上でデータを統合し、拡張子を”.html”として出力すればよいことになります。

もしくは、ファイル出力にもappendモード(追加)もありますのでそちらを使用しても
よいことになります。(特にソースの中身を操作する必要がないのであれば)

ご質問のことを実現するためには、まずファイル操作についてどのようなことができるのかは
全て頭に叩き込んでから検討すると、どのようにすればよいのかが見えてくると思いますの
で頑張ってください。ファイル操作については、(VB.NET ファイル操作)で検索すると
沢山検索できるかと思います。それらを読み理解しそれでも解らなければ、その項目一つ一つ
について別途ご質問してください。

投稿日時 - 2010-04-12 10:10:29

お礼

ありがとうございました

投稿日時 - 2010-10-23 18:50:18

ANo.1

ファイル名は質問文にある通りの命名規則なら、配列などに入れた状態で、文字列としてソートすればいいんじゃないですかね。

テキストファイルの読み込みと書き出しなら検索すれば出てくるでしょう。
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=vb.net+%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB&num=50
どうせなら HTML としてのヘッダーやフッターの部分もそれぞれテキストファイルに持っておいて連結したら良いと思います。

投稿日時 - 2010-04-12 09:50:08

あなたにオススメの質問