[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『改行をbrタグとpタグに変換する』(ゆうき)
よろしくおねがいします。
要点を簡潔に書くと、次のようになります。
・###########の中の文章のように、改行をbrタグとpタグに変換するツールをエクセルのVBAで作りたい。
・2行以上の改行も無視しないで反映する。(変換後を参照)
・デスクトップの「テキスト」というフォルダにある、複数のテキストファイル(.txt)をすべて一括で変換したい。
・あまり詳しくないですが、改行コードは\nやLFやCRやCRLFなどたくさんのタイプがあるようです。文中でどの改行コードが使われていても、一つの文中で、複数のタイプの改行コードが使われていても、変換できるようにしたい。
VBAでなければ、似たようなツールはたくさんるようです。
このツールを使うと、変換後のように、2行以上の改行が無視されてしまします。
改行をbrタグとpタグに変換するツール
http://tool.muzin.org/pbr/
変換前
##########################################################
祇園精舎の鐘の声、諸行無常の響きあり。
娑羅双樹の花の色、盛者必衰のことわりをあらはす。
おごれる人も久しからず、只春の夜の夢のごとし。
たけき者もついには滅びぬ、ひとへに風の前の塵に同じ。
##########################################################
変換後(2行以上の改行が無視されてしまっている。)
##########################################################
<p>
祇園精舎の鐘の声、諸行無常の響きあり。<br />
娑羅双樹の花の色、盛者必衰のことわりをあらはす。
</p><p>
おごれる人も久しからず、只春の夜の夢のごとし。
</p><p>
たけき者もついには滅びぬ、ひとへに風の前の塵に同じ。</p>
##########################################################
一括変換、ExcelのVBAを用いて変換、2行以上の改行も無視しないで変換、これらを満たしているツールを見つけられませんでしたので、質問させて頂きました。
初心者ですが、よろしくおねがいします。
< 使用 Excel:unknown、使用 OS:unknown >
Sub test() Dim WSH As Object Dim cPath As String Dim cFile As String Dim cFiles As Variant Dim F1 As Integer Dim bw() As Byte Dim cw As String Dim i As Long
Set WSH = CreateObject("WScript.Shell") cPath = WSH.SpecialFolders("Desktop") & "\テキスト\"
cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B/S """ & cPath & "*.txt""").StdOut().ReadAll(), vbNewLine) For i = 0 To UBound(cFiles) - 1 ReDim bw(FileLen(cFiles(i)) - 1) F1 = FreeFile Open cFiles(i) For Binary As #F1 Get #F1, , bw Close #F1
cw = StrConv(bw, vbUnicode) cw = Replace(cw, vbCrLf, vbLf) cw = Replace(cw, vbLf, vbCr) cw = "<p>" & Replace(cw, vbCr, "</p>" & vbCrLf & "<p>") & "</p>"
cFile = Left(cFiles(i), Len(cFiles(i)) - 4) & ".htm" If Dir(cFile) <> "" Then Kill cFile End If F1 = FreeFile
Open cFile For Binary As #F1 Put #F1, , cw Close #F1 Next i End Sub (???) 2015/05/29(金) 11:37
Sub test() Dim WSH As Object Dim cPath As String Dim cFile As String Dim cFiles As Variant Dim F1 As Integer Dim bw() As Byte Dim cw As String Dim i As Long
Set WSH = CreateObject("WScript.Shell") cPath = WSH.SpecialFolders("Desktop") & "\テキスト\"
cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B/S """ & cPath & "*.txt""").StdOut().ReadAll(), vbNewLine) For i = 0 To UBound(cFiles) - 1 ReDim bw(FileLen(cFiles(i)) - 1) F1 = FreeFile Open cFiles(i) For Binary As #F1 Get #F1, , bw Close #F1
cw = StrConv(bw, vbUnicode) cw = Replace(cw, vbCrLf, vbLf) cw = Replace(cw, vbLf, vbCr) cw = Replace(cw, vbCr & vbCr, "</p><br>" & vbLf & "<p>") cw = "<p>" & Replace(cw, vbCr, "<br>" & vbLf) & "</p>" cw = Replace(cw, vbLf, vbCrLf)
cFile = Left(cFiles(i), Len(cFiles(i)) - 4) & ".htm" If Dir(cFile) <> "" Then Kill cFile End If F1 = FreeFile
Open cFile For Binary As #F1 Put #F1, , cw Close #F1 Next i End Sub (???) 2015/05/29(金) 11:46
・文字化けしてしまいました。おそらく、もともとのテキストファイルが、UTF-8であったためだと思われます。Shift-JSとUTF-8と両方のバージョンを作っていただけると助かります。変換前がShift-JSなら変換後もShift-JSに、変換前がUTF-8なら変換後もUTF-8になるようにお願いします。一つのコードでShift-JSとUTF-8と両方できれば理想ではありますが、別々のコードでも大丈夫です。
・からのpタグはあんまり使いたくありません。<br>を連続させたいです。初心者なのでよくわかりませんが、一応記載してみました。
「あいうえお」の後に改行コードが1つだけなら、 あいうえお<br>
「あいうえお」の後に改行コードが2つ連続なら、<p>あいうえお</p>
「あいうえお」の後に改行コードが3つ連続なら、<pあいうえお></p><br>
「あいうえお」の後に改行コードが4つ連続なら、<p>あいうえお</p><br><br>
「あいうえお」の後に改行コードが5つ連続なら、<p>あいうえお</p><br><br><br>
なお、テキストファイルの出だし、先頭、一番最初の文字が改行コードで始まることはないです。
・変換前と変換後の例を修正しました。この掲示板も2行以上の改行が無視されてしましますので、変換前ではドットを入れて、2行以上の改行を表しました。
変換前のtxtで、10行の改行があれば、変換後のhtmでも10行の改行が必要です。
このツールを使うと、変換後のように、2行以上の改行が無視されてしまします。
改行をbrタグとpタグに変換するツール
http://tool.muzin.org/pbr/
変換前
##########################################################
祇園精舎の鐘の声、諸行無常の響きあり。
娑羅双樹の花の色、盛者必衰のことわりをあらはす。
おごれる人も久しからず、只春の夜の夢のごとし。
.
.
.
.
.
.
.
.
.
.
たけき者もついには滅びぬ、ひとへに風の前の塵に同じ。
##########################################################
変換後(2行以上の改行が無視されてしまっている。)
##########################################################
<p>
祇園精舎の鐘の声、諸行無常の響きあり。<br />
娑羅双樹の花の色、盛者必衰のことわりをあらはす。
</p><p>
おごれる人も久しからず、只春の夜の夢のごとし。
</p><p>
たけき者もついには滅びぬ、ひとへに風の前の塵に同じ。</p>
##########################################################
(ゆうき) 2015/05/29(金) 17:17
よろしくおねがいします。
(ゆうき) 2015/05/29(金) 17:22
Sub test() Dim WSH As Object Dim cPath As String Dim cFile As String Dim cFiles As Variant Dim F1 As Integer Dim bw() As Byte Dim cw As String Dim i As Long Dim j As Long Dim ip As Long Dim vw As Variant
Set WSH = CreateObject("WScript.Shell") cPath = WSH.SpecialFolders("Desktop") & "\テキスト\"
cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B/S """ & cPath & "*.txt""").StdOut().ReadAll(), vbNewLine) For i = 0 To UBound(cFiles) - 1 ReDim bw(FileLen(cFiles(i)) - 1) F1 = FreeFile Open cFiles(i) For Binary As #F1 Get #F1, , bw Close #F1
cw = StrConv(bw, vbUnicode) cw = Replace(cw, vbCrLf, vbLf) cw = Replace(cw, vbLf, vbCr) vw = Split(cw, vbCr)
ip = 0 cw = "" For j = 0 To UBound(vw) - 1 If vw(j) <> "" Then If ip = 1 Then cw = cw & "<br>" & vbCrLf & vw(j) Else cw = cw & "<p>" & vw(j) ip = 1 End If Else If ip = 1 Then cw = cw & "</p>" & vbCrLf ip = 0 Else cw = cw & "<br>" & vbCrLf End If End If Next j
If ip = 1 Then cw = cw & "</p>" End If
cFile = Left(cFiles(i), Len(cFiles(i)) - 4) & ".htm" If Dir(cFile) <> "" Then Kill cFile End If F1 = FreeFile
Open cFile For Binary As #F1 Put #F1, , cw Close #F1 Next i End Sub
UTF-8なら出力もUTF-8。これは面倒ですねぇ。私は時間をかけたくないです。
UTF-8対応は、ADODB.Stream というのを利用すれば可能なので、ご自身で検索して、トライしてみてください。
(???) 2015/05/29(金) 18:17
???様にはお世話になりましたので、よろしければ、???様だけではなく、ほかの方もお願いします。
> 改行の個数だけで判定するのでは不足なので、いったん全行にバラして、1行ずつ処理するように変えてみます。
UTF-8の問題を除けば、おそらくうまくできたのですが、このアイディアをもう少し具体的に日本語で説明していただけないでしょうか。VBAを見てみましたが、よくわかりません。
>UTF-8なら出力もUTF-8。これは面倒ですねぇ。
プログラミングはわからないので、どなたかできるスキルをお持ちの方がいらっしゃればお願いします。文字コードを変換するフリーソフトはありますが、私以上の初心者も使うので、VBAの中で一括でやる必要があります。
(ゆうき) 2015/05/29(金) 20:53
> 変換後(2行以上の改行が無視されてしまっている。) > ########################################################## > <p> > 祇園精舎の鐘の声、諸行無常の響きあり。<br /> > 娑羅双樹の花の色、盛者必衰のことわりをあらはす。 > </p><p> > おごれる人も久しからず、只春の夜の夢のごとし。 > </p><p> > たけき者もついには滅びぬ、ひとへに風の前の塵に同じ。</p> > ########################################################## と書かれていますが、
(質問1) このテキストをブラウザーで表示すれば、原文とまったく同じ体裁で 表示されるはずです。 これでは何がまずいのですか?
(質問2) タグを埋め込む目的は何ですか、それをどのように使うのですか。 そこを説明されれば、別の対応策が提示されるかもしれません。
(γ) 2015/05/29(金) 22:58
よろしくおねがいします。
ここより下は、γさまへの回答です。
(質問1)
表示されません。やってみてください。
(質問2)
詳しくは省略しますが、改行が正確に反映されないのは困ります。
(ゆうき) 2015/05/29(金) 23:31
横から失礼します。
>>表示されません。やってみてください。
当然、γさんは、確かめた後でレスしておられると思います。 たとえば、
http://www.leak-family.jp/sampl/web_tag/newpage1.htm
このページで、このテキストを貼り付け、タグテストを実行すると、原文と全く同じ体裁で表示されますよ。 (少なくとも、私のPCでは)
>.詳しくは省略しますが、改行が正確に反映されないのは困ります。
困るから皆で知恵を出し合おう、目的によっては、別の、もっと適した解決方法もあるかも、ということをγさんが示唆しておられると思います。 「詳しくは省略・・」では、前に進まないと思うのですが?
(β) 2015/05/30(土) 07:50
βさんどうもありがとうございます。
もちろん、掲載例をそのまま使って確かめました。 掲載例では同じものが得られますね。
正確にいうと 改行コードが連続3個以上 ということですね。 そこは了解しました。
それで目的がよくわからないのです。 プレーンなテキストをHTMLに反映したいということですか? そこを明確にして欲しいのです。
新しいHTMLを作るなら多数の空白行を律儀に再現する必要もないでしょうし、 いや、空白行の数がポイントで、そこが命だということなら、 <pre></pre>で囲ってしまえば、改行タブは一切使わずに そのままの形でとりこめますよね。
(γ) 2015/05/30(土) 09:21
ADODB.streamを使ったコードはいくらでもネット上にあるわけですが、 障害になるだろうと思う点があります。
文字コードを自動判定して欲しい(*)ということだろうが、 Charsetプロパティに"_autodetect_all"を指定しても うまく判定できないこともありますから、そこがネックになりえます。 以前にそんな議論をした覚えがあります。
単に、 > プログラミングはわからないので、 という理由で、何から何までリクエストされても いささか戸惑います。
仕事でやっているなら、自分でマクロを学ぶ姿勢を少なくとも見せるべきだし、 どうしてもということなら外部にアウトソースしたらどうですか?
(*) そのテキストがどういう経緯で作られたものか知らないので、 実際に各種のバラエティが有るのかも知れない。 ただ、ひょっとして、リクエストし放題ということで、 仕様を広めにリクエストしているのかも知れないと想像しています。
(γ) 2015/05/30(土) 10:07
私の説明不足の点は申し訳ありませんが、???さまにいただいたコードで、助かっております。
ここでいったん終了にします。
みなさま、ありがとうございました。
(ゆうき) 2015/05/31(日) 05:32
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.