[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『改行コードを、brタグとpタグに、一括置換する』(まさみ)
ほかのサイトも参考にさせて頂きながら、
できるだけわかりやすく、何回も書き直しながら、書いたつもりですが、わかりにくい箇所があったら申し訳ありません。
ネット上でいろいろ探して、似たようなコードはたくさん見つけましたが、私のようにCSSで行間を調整しようとしている人向けのコードはありませんでした。
どうぞよろしくおねがいします。
以下、ルールと補足と具体例です。
◆ルール◆
1.「あいうえお」の後に改行コードが1つだけの場合なら、<p id="num1">あいうえお</p> または あいうえお<br />
2.「あいうえお」の後に改行コードが2つ連続の場合なら、<p id="num2">あいうえお</p>
3.「あいうえお」の後に改行コードが3つ連続の場合なら、<p id="num3">あいうえお</p>
4.「あいうえお」の後に改行コードが4つ連続の場合なら、<p id="num4">あいうえお</p>
5.「あいうえお」の後に改行コードが5つ連続の場合なら、<p id="num5">あいうえお</p>
6.「あいうえお」の後に改行コードがnつ連続の場合なら、<p id="numn">あいうえお</p>
◆補足◆
・任意のフォルダ(たとえば、デスクトップの「テキスト」というフォルダ)にある、複数のテキストファイル(.txt)をすべて一括で置換する形式です。
・「 <p id="num1">あいうえお</p> または あいうえお<br> 」というのは、VBAコードをコメントアウトなど活用して、1つのマクロで、どちらでも対応できるようにしたいという意味です。「 <p id="num1">あいうえお</p> 」は文字の前後を囲うのに対し、「 あいうえお<br> 」は文字の後ろだけ置換するので、ここだけ少しルールが違うと思います。
・プログラムはできないので、推測になってしまいますが、1.「あいうえお」の後に改行コードが1つだけの場合でも、「 <p id="num1">あいうえお</p> 」というようにまず一回無条件に置換して、一回置換し終わったこの文字列をさらに2回目として置換して、「 あいうえお<br /> 」にすれば、わかりやすいかと思います。それをさらに置換する部分のコードを、必要に応じてコメントアウトすれば、よいのかなと思っています。
・改行コードは\nやLFやCRやCRLFやLFCRなどたくさんのタイプがあるようです。文中でどの改行コードが使われていても、一つの文中で複数のタイプの改行コードが使われていても、変換できるようにしたいと思っています。
・置換した後の拡張子は.txtのままがよいです。
・変換された拡張子.txtのファイルはいずれ別のツールで別の処理をかけて.htmlにします。拡張子.htmlの場合、変換後1、変換後2、変換後3は、いずれもブラウザでは同じように表示されると思います。しかし、htmlファイルを人間が編集することもあるので、見やすいように変換後1のように改行もそのまま残したいと思います。
・文字列は「あえいうえお」のように日本語とは限らず、アルファベットであったり、HTMLタグであったります。たとえば、「あ<span style="color : red">いう</span>えお」や、「あ<span id="red">いう</span>えお」です。HTMLタグも、あたかも普通の文字列のように、1.から6.と同じルールで、置換したいと思っています。
・「 <p id="num1">あいうえお</p> 」などのid属性は、CSSで行間やスペースを調整するために付けています。
・文字コードは、別のソフトで簡単に変換できるようなので、変換前のファイルも、変換後のファイルもShift_JSで大丈夫です。
◆具体例◆
変換前
===========================================================
祇園精舎の鐘の声、諸行無常の響きあり。
.
.
.
娑羅双樹の花の色、盛者必衰のことわりをあらはす。
おごれる人も久しからず、只春の夜の夢のごとし。
.
.
.
.
.
.
たけき者もついには滅びぬ、ひとへに風の前の塵に同じ。
===========================================================
変換後1
===========================================================
<p id="num4">
祇園精舎の鐘の声、諸行無常の響きあり。
</p>
.
.
.
<p id="num7">
娑羅双樹の花の色、盛者必衰のことわりをあらはす。<br />
おごれる人も久しからず、只春の夜の夢のごとし。
</p>
.
.
.
.
.
.
<p id="num2">
たけき者もついには滅びぬ、ひとへに風の前の塵に同じ。
</p>
===========================================================
変換後2
===========================================================
<p id="num4">祇園精舎の鐘の声、諸行無常の響きあり。</p>
.
.
.
<p id="num7">娑羅双樹の花の色、盛者必衰のことわりをあらはす。<br />
おごれる人も久しからず、只春の夜の夢のごとし。</p>
.
.
.
.
.
.
<p id="num2">たけき者もついには滅びぬ、ひとへに風の前の塵に同じ。</p>
===========================================================
変換後3
===========================================================
<p id="num4">
祇園精舎の鐘の声、諸行無常の響きあり。
</p>
<p id="num7">
娑羅双樹の花の色、盛者必衰のことわりをあらはす。<br />
おごれる人も久しからず、只春の夜の夢のごとし。
</p>
<p id="num2">
たけき者もついには滅びぬ、ひとへに風の前の塵に同じ。
</p>
===========================================================
< 使用 Excel:Excel2013、使用 OS:Windows 10 >
HNは異なりますが
[[20150529105725]] 『改行をbrタグとpタグに変換する』(ゆうき)
これの続きですか?
(β) 2015/09/19(土) 16:42
HTMLそのものには疎いので、ずれているところもあるかも知れませんが。
1.要は、テキストファイルの行末に改行コードがいくつあろうと1つにしたいということですよね?
2.プログラムロジックを考えられて変換1−>変換2−>変換3 といった処理ロジックとサンプルを提示しておられます。 お書きになったように、これまでのやり取りの中で、なかなか回答側が、質問にマッチするピタッとしたものの提示ができていないので ロジックを教えるから、このようにコードをかいてごらんということなんだろうと思いますが、ここは1発変換でも5段階変換でもいいのですよね?
3.複数のテキストファイルを一括して処理するというのはわかりますが、ステップとしては
1)まず、単一のテキストファイルを読みこんで、それを変換して目的を達成する。 2)うまくいけばフォルダ内のファイルの一括処理とする。
こんな手順をおすすめします。最も重要なのは 1)ですよね。 1)ができれば、あとは機械的に 2)ですから。
4.また </p> あるいは </br> これを、両方組み込んでおいて、1つをコメントにして、どちらでも使えるようにしたいという要望もわかりますが ここも、一足飛びに、それを目指すのではなく、別々のものとして完成させて、余裕があれば合体させるという手順がいいと思いますよ。 繰り返しますが、まず、最初に達成しなきゃいけないのは 1) ですよね。
(β) 2015/09/19(土) 17:31
もう1つ。これも門外漢なのですべっているかもしれませんが。
>>改行コードが1つだけの場合なら、<p id="num1"> >>改行コードが2つ連続の場合なら、<p id="num2">
ということは 改行コードが 100個なら num100 ですか?
それぞれわける意味は?
>>改行コードは\nやLFやCRやCRLFやLFCR
といわれるとおり(\n はパターンであって文字ではなく、また エクセルの世界では LFCR という記述はできないと思いますけど) 様々なコードがあるわけですが、CRLF は CR と LF が2つ連続している文字列(2桁)です。 ということは CR という改行(キャリッジリターン)とLF(ラインフィード) の2つあるものとの区別がつきません。 CRLF なら num1 、CR と LF なら num2 という区別ができないわけですけど、そもそも num1 と num2 にしたい理由は何でしょうか?
(β) 2015/09/19(土) 18:08
前回の質問は私の知人の者が書いたものですが、かなりわかりにくかったので、書き直しました。
何回も変換したり、<p id="num1"><p id="num2">と分ける理由は、HTMLの改行が理由です。むしろそのためのプログラムです。
連続改行brはNG!?覚えておいて損はない改行と段落の使い分け方
http://naifix.com/br/
HTMLが門外漢の方にはわからない可能性が高いと思いますが、HTML的な理由がわからなくても、VBAのコードを作っていただく際には、できるかぎり支障のないような質問をさせて頂いたつもりです。
VBAはまったくわからないので、具体的なコードを書いていただける方がいらっしゃれば、どうぞよろしくおねがいします。
(まさみ) 2015/09/19(土) 22:26
>>前回の質問は私の知人の者が書いたもの
なるほど。コメントのトーンはにておられますね。(わからない人はいい、わかる人だけ、こたえて というトーン)
>>HTMLの改行が理由です。むしろそのためのプログラムです。
わかっていますよ。でも、1回で対応できればそれでいいんでしょ?
なぜ、こんな質問をしたかというと、改行にはいろんなコードがある(データをつくる人がいろんな改行コードを好き勝手に使う?) それらをすべてカバーしてねと書いておられたので。
CRLF は CR と LF の 2桁ですが、1まとめにすれば改行は1行(のはず) でも、かりに
あいうえおCRLF LF (空行) CRかきくけこ
なんていう意地悪な文字列があったとき、実際には あいうえおCRLFLFCRかきくけこ になっていますので あいうえお と かきくけこ の間にはいくつの改行があったのか、なんだかわかりづらくなりますねということを申し上げたんです。
これは HTML がどうこうという範疇の問題ではなく。
なので、単独のLF と 連続した CRLF と 念のため 単独の CR を改行とみなして下さいと、そこまで明確に定義されるべきだということをもうしあげました。 そういった定義があれば、はい、わかりました というところなんです。
手元に一応書き上げたコードがあって、結果はでているんですが、その改行コードに関する、(まさみ)さんの 【覚悟】を質問しています。(世の中で使われる改行コードをすべてサポートせよというのではなく。)
(β) 2015/09/19(土) 22:51
【門外漢】ですが、コードをアップします。 通常の改行で作られているファイルと、無理やり CR単独、LF単独、さらには LFCR(?) も埋め込んだファイルで処理し 結果を前スレでも参照した
http://www.leak-family.jp/sampl/web_tag/newpage1.htm
ここで表示確認もしましたが、いかんせん【門外漢】ですから、これでいいのかどうか? 変換後文字列は、(まさみ)さんの指定仕様通りにしているつもりですが、これが正しい仕様かどうか、【門外漢】ですからわかりません。 で、やはり【門外漢】ですから、 num● と、わざわざわける意図が? ですけど。
(自分に対しては門外漢という言葉は使いますが質問者さんが回答者に対して使うのは、いささか・・・・)
まずは単一のテキストファイルを読んで変換、結果をマクロブックのアクティブシートのA1に書きこみますので 確認願います。OKであれば、これをテキストファイルに書き戻し、ないしは別テキストファイルとして生成。 さらには複数テキストファイル対応と進んでいかれたらよろしいかと。
コード中の ★部分は実際のファイルフルパスに変えてください。
処理は txt2HTML という共通プロシジャにしてあります。 これを実行プロシジャの Test1(brタイプ)、Test2(pタイプ) から使う構成です。
Sub Test1() txt2HTML True End Sub
Sub Test2() txt2HTML False End Sub
Sub txt2HTML(br As Boolean) Dim fsx As String Dim pre As String Dim s As String Dim reg As Object Dim mt As Object Dim sm As Object Dim i As Long Dim w As Variant Dim fso As Object Dim myTxt As Object
Set reg = CreateObject("VBScript.RegExp") Set fso = CreateObject("Scripting.FileSystemObject")
reg.Pattern = "(.+)(\n+)" reg.Global = True
Set myTxt = fso.OpenTextFile(Filename:=ThisWorkbook.Path & "\Test.txt", IOMode:=1) '★ s = myTxt.ReadAll myTxt.Close s = Replace(s, vbCrLf, vbLf) s = Replace(s, vbCr, vbLf) Set mt = reg.Execute(s)
If mt.Count = 0 Then MsgBox "変換対象はありません" Else ReDim w(1 To mt.Count)
For Each sm In mt i = i + 1 If br Then pre = "" fsx = "</br>" Else pre = "<p id=""num" & Len(sm.submatches(1)) & """>" fsx = "</p>" End If w(i) = pre & sm.submatches(0) & fsx
Next
Range("A1").Value = Join(w, "") End If
End Sub
(β) 2015/09/20(日) 06:04
>なるほど。コメントのトーンはにておられますね。(わからない人はいい、わかる人だけ、こたえて というトーン)
大変申し訳ありませんでした。
改行コードに関する知識が不足していました。
シンプルにするため、改行コードはCRLF(Windows)だけにします。
複数のタイプの改行コードが、同じ文章内で使われている可能性はかなり低いと思いますので、この可能性は無視することにします。
LFCR(?)なども無視します。
実用上は問題ないと思いますし、このほうが良いということがわかりました。
さらに可能であれば、「 CRLF(Windows) または CR(MacOS) または LF(UNIX) 」というようにして、CRLF(Windows)だけの文章をマクロで処理するときは、CR(MacOS)とLF(UNIX)の部分の行はコメントアウトしておく、というような仕様にしていただけると、なおありがたいです。
同様にCR(MacOS)だけの文章をマクロで処理するときは、CRLF(Windows)とLF(UNIX)の部分の行はコメントアウトしておくことになると思います。
申し訳ありませんが、どうぞよろしくおねがいします。
(まさみ) 2015/09/20(日) 06:46
>num● と、わざわざわける意図が? ですけど。
これがこのプログラムの醍醐味です。分けるためのプログラムです。
基本的なHTMLの知識や現場経験がないと難しいのかもしれませんが、以下のページが参考になると思います。
しかし、プログラムを書いていただくうえでは、関係ないように質問させていただいております。
連続改行brはNG!?覚えておいて損はない改行と段落の使い分け方
http://naifix.com/br/
(まさみ) 2015/09/20(日) 06:52
一度、macベースやunixベースの文章でアップしたコードを試してもらえませんか。
一応、順番としては 2桁の CRLF を 1桁の LF に、次に、1桁の CR を 1桁の LF に変換。 つまり、mac,unix,windowsにかかわらず、改行は1桁の LF にしてから処理していますので このコードのままでOKだと思っているんですが? (意地の悪い LFCR なんてのが、もし、どこかのOSにあれば、ここは改行が1つ多く判断されてしまいますが) (追加: IBM等のEBCDICが元ネタの場合は、ちょっと心配な面もありますが)
ご紹介ありがとうございます。なるほどなと思いながら読ませていただいています。 でも、num1 でも num10 でも num100 でも、ブラウザ上の表示は変わりませんよね? なので、質問したんですが、このあたりは、βがわかっていないだけなんでしょうね。
(β) 2015/09/20(日) 07:19
デスクトップの「テキスト」というフォルダの中にあるすべてのテキストファイルを一括置換するために、以下のようにしたら、エラーになってしまいました。
質問のタイトル『改行コードを、brタグとpタグに、一括置換する』のように、一括置換するにはどうすればよいでしょうか?
Set myTxt = fso.OpenTextFile(Filename:="C:\Users\ユーザー名\Desktop\テキスト\*.txt", IOMode:=1) '★
どのようにすればよいでしょうか?
>でも、num1 でも num10 でも num100 でも、ブラウザ上の表示は変わりませんよね?
HTMLだけでは変わりませんが、ご紹介させていただいたホームページにもありますように、CSSで調整すれば変わります。今回はそれが目的のプログラムです。
よろしくおねがいします。
(まさみ) 2015/09/20(日) 07:38
CSSでの調整の件、ご教示ありがとうございました。
>>「テキスト」を「text」にしてみても、エラーになってしまいます。
これはどのコードのことでしょうか? アップしたコードには "テキスト" という文字列はありませんが?
それと、VBAのQ/Aに慣れていらっしゃらないのかもしれませんが
・エラー になってしまう というレスだけでは全く状況がつかめません。 どのコードで、発生したのか、それはコンパイルエラーなのか実行時のエラーなのか。 また、そのエラーで表示された エラー番号とエラーメッセージの内容はどうだったか、 これらをレポートしてください。 ・また、【コードを微修正したけどだめでした】といわれても、どのように直されたのかがわからないと これも判断のしようがありません。 エラーになったコードを、部分だけではなく、Sub から End Sub まで、そのままコピペでアップしてください。
(β) 2015/09/20(日) 07:47
また
>>質問のタイトル『改行コードを、brタグとpタグに、一括置換する』のように、一括置換するにはどうすればよいでしょうか?
最初のレスでコメントしていますが、1つずつ進めていかれるべきです。
まず、生成されたHTML文字列そのものがOKだったのかどうか。 その確認がないまま、ファイルを書き換え、さらには フォルダ内ファイルをすべて処理するという機能を 一緒くたに盛り込んですすめると、きわめて効率が悪い開発手順になります。
1つずつ、確認してください。
とにかく、早く、完成版コードがほしい、途中のうんちくはいらない という気持ちもわからないではないですが 急がば回れですよ。
(β) 2015/09/20(日) 07:57
あぁ、(まさみ) 2015/09/20(日) 07:38 のレスを見落としていました。
これは、コード構文そのものが間違っているんですが、まずは↑で申し上げた手順で行きましょう。
文字列変換そのものはOKだったんですか?
(β) 2015/09/20(日) 08:01
本質とは関係ない門外漢のようなところをかなり気にされていたり、「一括置換」「置換後も.txt」などの質問とは全く異なるプログラムになっているようです。
時間をかけてゆっくりやることはできませんので
ネットかリアルか、優良の外注か無料かはまだ決めていませんが、ほかの方にお願いすることにします。
申し訳ありませんが、ご了承ください。
この質問はいったん終わりにします。
ありがとうございました。
(まさみ) 2015/09/20(日) 09:00
判断は(まさみ)さんの専管事項ですから、どうぞ、そのように。
申し上げたのは、アップしたコードで変換した文字列は要件にあっていたのかどうかということです。 その確認がないまま、他の機能を追加しても効率が悪いということなんです。 これは、外注してプログラムを作ってもらう場合も同じですよ。
変換がOKという確認がとれれば、あとは フォルダから読み込一括変換して txtファイルにするということは ほんの付け足しでできることですので。
(β) 2015/09/20(日) 09:36
一応変換がOKだったらアップしようと思っていたコード、以下に。 DeskTop上の "テキスト" というフォルダ内のtxtファイルを変換し、同じくDeskTop上の "HTML変換" というフォルダに 元のファイル名_HTML.txt という名前で格納します。
Test1,Test2はかわりません。
Sub txt2HTML(br As Boolean) Dim fsx As String Dim pre As String Dim s As String Dim reg As Object Dim mt As Object Dim sm As Object Dim i As Long Dim w As Variant Dim fso As Object Dim myTxt As File Dim myNew As Object Dim fPath As String Dim tPath As String Dim ext As String Dim bName As String
Set reg = CreateObject("VBScript.RegExp") Set fso = CreateObject("Scripting.FileSystemObject")
fPath = CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\テキスト" '★ tPath = CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\HTML変換" '★
'コピー先フォルダ内のクリア On Error Resume Next Kill tPath & "\*.*" On Error GoTo 0
reg.Pattern = "(.+)(\n+)" reg.Global = True
For Each myTxt In fso.GetFolder(fPath).Files If LCase(fso.GetExtensionName(myTxt.Name)) = "txt" Then bName = fso.GetBaseName(myTxt.Name) s = myTxt.OpenAsTextStream.ReadAll myTxt.OpenAsTextStream.Close s = Replace(s, vbCrLf, vbLf) s = Replace(s, vbCr, vbLf) Set mt = reg.Execute(s)
If mt.Count > 0 Then ReDim w(1 To mt.Count) i = 0 For Each sm In mt i = i + 1 If br Then pre = "" fsx = "</br>" Else pre = "<p id=""num" & Len(sm.submatches(1)) & """>" fsx = "</p>" End If w(i) = pre & sm.submatches(0) & fsx
Next
End If
Set myNew = fso.CreateTextFile(Filename:=tPath & "\" & bName & "_HTML.txt", OverWrite:=True) myNew.write Join(w, "") myNew.Close
End If
Next
End Sub
(β) 2015/09/20(日) 10:01
# 前回質問でも、少しやりとりしたので、発言させていただく。
βさんもさぞ驚き、がっかりしていることでしょう。心中察するに余りある。 # 私のように暴発もせず、さすがです。
まあ、過去質問と同じ人でしょうね。 いろいろなサイトを調べたと言う一方で、 以前の質疑をおくびにも出さないところに作為を感じます。
「VBAはまったくわからないので」という理由で、さも権利でもあるかのように、 他人に丸投げして置いて、本質と違うところにどうだこうだとか、時間がかかるだの、 よくしゃあしゃあと言えたものです。無礼かつ図々しいにも程がある。 本質的で無いところも含めて、適切さを欠くお願いをしているのは貴君のほうだろう。
だいたい、自分の取り組んでいる作業に必要なら、VBAくらい自分でトライすべきです。 そのうえで、ここがわからない、といった質問をすべきです。 万一、他人もかかわっているとしたら、全員が全員、そういう考え方の人ばかりなのか。 こうした種類の作業は、自分である程度コントロールできなければ、普段の改善などできやしない。 そのためには、VBAに限定せず、スクリプト言語などのツールも含めて検討したほうがよい。 横着を咎めると言うより、そのほうが益が多いだろうと申し上げているわけだ。
ついでに言えば、人に依頼する立場でありながら、 >HTMLが門外漢の方にはわからない可能性が高いと思いますが、 などと、よくしゃあしゃあと言えるものですね。 謙遜している相手に失礼じゃないのかな。人としてどうかと思う。
また、「VBAはまったくわからないので」というのも疑わしい気がする。 今後、こうした掲示板で質問をするなら、上記したことを頭に留めて欲しい。
# 実は私も正規表現を使ったコードは書き上げていて、仕様に沿った結果は得られれているが、 # まったく無駄になった。残念ではある。
(γ) 2015/09/20(日) 10:10
To γさん
代弁、ありがとうございます。斟酌いただき深謝します。 ふぅ〜・・・というところです。はい。
テーマとしては面白そうなので正規表現の勉強を兼ねて取り組みました。 おそらくγさんが用意されたものは Replace 一発変換だと推察します。 私の力量では $2 の桁数をセットした上でのReplaceができず断念しました。 このようなことになり、γさんのコードを拝見する機会を逸したことが残念です。
(β) 2015/09/20(日) 10:24
> テーマとしては面白そうなので正規表現の勉強を兼ねて取り組みました。 同感でした。 私も、Submatchの文字列を直接置換しました。 複数行の文字列部分の途中改行を </br>+改行 とするところは、 行数が可変なので、re.Replaceでは無理でしょう。 VBScriptの正規表現のReplaceは小回りが余りききませんね。
それでは。 早く回復されることを願っています。 (γ) 2015/09/20(日) 10:37
失礼の節があったことをお詫びします。
またいずれ自分でマクロを勉強するときにここに挙げていただいたコードを、勉強材料にしようと思っています。
.
.
.
> 申し上げたのは、アップしたコードで変換した文字列は要件にあっていたのかどうかということです。
その確認がないまま、他の機能を追加しても効率が悪いということなんです。
プログラムは素人なので、まず小さくテストしてから、次に行くという考え方を、プログラムの分野に当てはめることができませんでした。
.
.
.
> 一応変換がOKだったらアップしようと思っていたコード、以下に。
DeskTop上の "テキスト" というフォルダ内のtxtファイルを変換し、同じくDeskTop上の "HTML変換" というフォルダに 元のファイル名_HTML.txt という名前で格納します。
『改行コードを、brタグとpタグに、一括置換する』プログラムなので、シンプルに、DeskTop上の "テキスト" というフォルダ内のtxtファイル直接置換してください。バックアップはほかのところにとってあります。
.
.
.
(β) 2015/09/20(日) 06:04
このレスのコードは、そのままコピペすると、エラーにはなりませんが、プログラムの知識がないこともあり、よくわかりません。
.
.
.
(β) 2015/09/20(日) 10:01
このレスのコードはAlt+F8を押しても、マクロの候補が出てこないので、マクロを開始できません。よってテストしてみてレポートすることはできません。
Sub txt2HTML(br As Boolean)を、Sub txt2HTMLというように置換して、コードを張り付けて、Alt+F8を押すと、「Sub txt2HTML」という名称のマクロの候補は出てきますが、もちろん(?)、別のエラーが出ます。
.
.
.
##またコードをシンプルにするため、一度作っていただいたものとは違うものになると思いますが、以下のようなルールに変更してください。これは重要です。
「 CRLF(Windows) または CR(MacOS) または LF(UNIX) 」というようにして、CRLF(Windows)だけの文章をマクロで処理するときは、CR(MacOS)とLF(UNIX)の部分の行はコメントアウトしておく、というような仕様にしていただけると、なおありがたいです。
同様にCR(MacOS)だけの文章をマクロで処理するときは、CRLF(Windows)とLF(UNIX)の部分の行はコメントアウトしておくことになると思います。
.
.
.
####一番最初の質問に記入した以下の部分も、重要です。
・変換された拡張子.txtのファイルはいずれ別のツールで別の処理をかけて.htmlにします。拡張子.htmlの場合、変換後1、変換後2、変換後3は、いずれもブラウザでは同じように表示されると思います。しかし、htmlファイルを人間が編集することもあるので、見やすいように変換後1のように改行もそのまま残したいと思います。
単純な置換というよりは以下のようなルールに書き換えたほうがわかりやすいかもしれません。
◆ルール◆
1.「あいうえお」の後に改行コードが1つだけの場合なら、改行コードを1つ追加して、2 つ連続にして、<p id="num1">あいうえお</p> または あいうえお<br />
2.「あいうえお」の後に改行コードが2つ連続の場合なら、改行コードを1つ追加して、3 つ連続にして、<p id="num2">あいうえお</p>
3.「あいうえお」の後に改行コードが3つ連続の場合なら、改行コードを1つ追加して、4 つ連続にして、<p id="num3">あいうえお</p>
4.「あいうえお」の後に改行コードが4つ連続の場合なら、改行コードを1つ追加して、5 つ連続にして、<p id="num4">あいうえお</p>
5.「あいうえお」の後に改行コードが5つ連続の場合なら、改行コードを1つ追加して、6 つ連続にして、<p id="num5">あいうえお</p>
6.「あいうえお」の後に改行コードがnつ連続の場合なら、改行コードを1つ追加して、n+1つ連続にして、<p id="numn">あいうえお</p>
.
.
.
とにかく一番最初の質問に書かせていただいた、変換後1のように、なればよいです。言葉だけではわかりにくいので、イメージで図解させていただきました。
変換後1がすべてです。
.
.
.
見にくく、わかりにくく、なってしまったし、##と####のこともあるので、もう一度、質問を書き直したほうがわかりやすいと思いますが、いかがでしょうか?
再度よろしくおねがいします。
(まさみ) 2015/09/20(日) 15:39
>>もう一度、質問を書き直したほうがわかりやすいと思いますが、いかがでしょうか?
そうですね。このトピを参照した形で、あらためて、初心に戻って、新しいトピを NO.2 という形で あげられるのもいいかもしれませんね。 学校には、γさんのように、文字列分析やWEB周りのアプリケーションに精通しておられる先生方がそろっておられますので 有益な回答が得られる期待は大きいですから。
とりあえず、質問されている件に対してだけお答えします。
>>(β) 2015/09/20(日) 10:01 このレスのコードはAlt+F8を押しても、マクロの候補が出てこないので、マクロを開始できません。 >>よってテストしてみてレポートすることはできません。
まず、(β) 2015/09/20(日) 06:04 のコードは、 実行マクロとしての Test1,Test2 と、そのサブルーティンとしてのtxt2HTML。 ただし、コメントしましたように、まず変換が要件通りかどうかの確認をしてもらうため、この時点での txt2HTML では ・1つのテキストファイルのみを読んで ・結果はマクロブックのシートのA1に書きこむ。 こうしています。
で、(β) 2015/09/20(日) 10:01 のコードは、【Test1,Test2はかわりません。】とコメントしている通り Test,Test2と新しくアップした txt2HTML で動かします。実行するマクロは Test1 ないしは Test2 です。
で、以下に、テキスト フォルダのファイルを直接変換するtxt2HTMLをアップしておきます。
(念のため Test1,Test2 も含めたフルセット)
これを検証いただき、ここから出発して、不足する要件を、追加要件として記載した新しいトピにされてはいかがでしょう。
★と、いったん、このバージョンのコードをアップしましたが、まぎらわしいので消去します。 もし、参照されるなら、(β) 2015/09/21(月) 10:46 でアップしなおしたほうをどうぞ。(9/21 10:54)
(β) 2015/09/20(日) 17:07
追加です。
OSによる改行コードのことを心配しておられますが、これまコメントした通り、このままのコードで いずれのOSで作成された文章でも対応しているつもりです。 まず、3種類のOSのデータで検証し、【つもり】が、そうなっていなければ、新しいトピの要件にされたらよろしいかと。
(β) 2015/09/20(日) 17:13
追加の追加で恐縮。
最終的に行に、【もともとの改行コード】を、その数+1セットするという要件なんですね。 そうなると、対象が cr なのか lf なのか crlf なのかを与える必要がありますね。 私のコードでいえば txt2HTML の引数に対象改行コードを追加して与えることになりますね。 一応、手元ではコードを改定して、実行確認もしていますので、もし、機会があれば、参考に提示することも あるかもしれませんね。
(β) 2015/09/20(日) 18:10
思いもよらぬ展開ですな。
> 外注に依頼することは簡単ですが、せっかくやっていただいているので これも気になるコメントだ。 こっちはどちらでも良いが、あなた方のために、 こちらを継続することにする、とでもいいたげだ。もっと書き方があるだろう。 基本的に、外注してもらって結構である。 そのほうがGDPを増やす?ことになるだろう。
それはいったん置くことにして、 まず、急いでいるなら、βさんからの検証依頼に早く回答すべきではないですか?
私からは、不明と思われる点を以下にメモします。
これらを明確にした仕様を記載した新しい質問スレッドを立ち上げれば、 さらに多くの方からコメントが得られるのではないですか? # 手元に一定の前提を置いたコードはあるが、まずは仕様の確定が先決かと思う。
【質問1】 ------------- 私はAに行く。 私はBに行く。 私はCに行く。 . ------------- という4行があった場合、 (以下、----は説明用に追加したもの。行頭の. は改行のみの行を示す。) これをどのように置換するのか。
形式1の場合、 ------------- <p id="num2"> 私はAに行く。<br /> 私はBに行く。<br /> 私はCに行く。 </p> . ------------- となるという理解でよいか。
【質問2】 それでは、<p id="num1">となるのはどのような時か。 段落なら、最終行の次に空白行があるから、最低でも num2とならないのか。 それとも、上記の 私はAに行く。 は、<p id="num1">と解釈すべきなのか。
【質問3】 例えば、<p id="num2">に関する、属性値 num2について。 本来、HTMLテキスト中でuniqueであるべきid属性ではなく、 class属性が適当と思うが、それはさておき、
2の意味は何か。 段落全体の表示上の行数でもない。 段落に続く空行のみ行の行数でもない。
CSSでは、具体的にどのようなpropertyを使って、 何を実現しようと考えているのか。 margin-bottomだろうか。 (出発点が間違っていると全体が無駄になるので念のため)
【質問4】 > CRLF(Windows) または CR(MacOS) または LF(UNIX) のそれぞれを読み分けることは良いとして、書き出すテキストファイルは 元の改行コードと同一のものとするのか、 それとも、なんらかの形式(例:CRLF)に統一するのか。
(γ) 2015/09/21(月) 06:17
新しいトピを立ち上げられたとして、βが、そこに参加する意欲がでるかどうか 現時点では、怪しいものがありますので、こちらの現在のバージョンのものをアップしておきます。 処理対象の文章の改行が vlCrLf なのか vbCr なのか vbLf なのかを、追加の引数として指定して使います。
txt2HTML 第1引数,第2引数
第1引数は従来通り True(brタイプ)、False(pタイプ) の2通り。 第2引数は vbCrLf、vbCr、vbLf の 3通り。
都合、組み合わせとしては6通り。以下、サンプルとして PタイプでvbCrLfを対象とする実行プロシジャ Test をアップしますが プロシジャ名を macTypeP とか winTypeBr といった名前で6つの実行プロシジャを準備しておいて使い分けするのがいいかもしれません。
オリジナルファイルを書き換え、書き換え後の 1行 あいうえお の後に、オリジナル文章での改行コードを、オリジナル文章にあった数+1 付加。
なお、老婆心ながら、新しいトピを 立ち上げられた際には、回答者が、回答しやすい流れ、逆にいえば、上手に回答を引き出せるような流れで コミュニケートされるようにされたらよろしいかと。 γさんのご忠告も、是非、真摯に受け止めて、質問するうえでの工夫として生かしてください。
9/22 5:40 最終行の最後に改行がない場合読み飛ばされるバグ訂正。パターンを微修正。 引数として追加した改行文字は、γさんのコードのように、自動判定可能でしたが そこは、そのままにしておきます。
Sub Test() txt2HTML False, vbCrLf End Sub
Sub txt2HTML(br As Boolean, nlc As String) Dim fsx As String Dim pre As String Dim s As String Dim reg As Object Dim mt As Object Dim sm As Object Dim i As Long Dim w As Variant Dim fso As Object Dim myTxt As File Dim myNew As Object Dim fPath As String Dim ext As String Dim x As Long Dim temp As String
Set reg = CreateObject("VBScript.RegExp") Set fso = CreateObject("Scripting.FileSystemObject")
fPath = CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\テキスト" '★
reg.Pattern = "(.+)(\n+|$)" reg.Global = True
For Each myTxt In fso.GetFolder(fPath).Files If LCase(fso.GetExtensionName(myTxt.Name)) = "txt" Then s = myTxt.OpenAsTextStream.ReadAll myTxt.OpenAsTextStream.Close If nlc <> vbLf Then s = Replace(s, nlc, vbLf) Set mt = reg.Execute(s)
If mt.Count > 0 Then ReDim w(1 To mt.Count) i = 0 For Each sm In mt i = i + 1 If br Then pre = "" fsx = "</br>" Else pre = "<p id=""num" & Len(sm.submatches(1)) & """>" fsx = "</p>" End If temp = "" For x = 1 To Len(sm.submatches(1)) + 1 temp = temp & nlc Next
w(i) = pre & sm.submatches(0) & temp & fsx Next
End If
'ファイル書き換え With fso.OpenTextFile(fPath & "\" & myTxt.Name, IOMode:=2) .Write Join(w, "") .Close End With
End If
Next
End Sub
(β) 2015/09/21(月) 10:46
反応が無いので、手元のコードを勝手に書き付けて終わりにします。
1. 私見では、 一行一行を段落としてみなしてしまう<p id="num1">は、 採り得ないと思った。 だから、いわゆるbr方式のみ対応している。
2. 改行コードは、入力から自動判定し、 それと同一の改行コードを書き出すものとした。
3.アウトプットの形式1〜形式3は、md変数に割り当てているので、 その部分を選択して欲しい。
4. 入力フォルダと、(その一部を変更した)出力フォルダを指定する方式としている。 そこも修正して欲しい。 (なお、自分自身を書き換えてしまうのは、結果が正常とみなされてからで良い。 それまでには、テストを何度も実行するはずなので、 そのたびに正常フォルダから、入力フォルダにコピーし直す必要がある。 これは手間なはず。 別フォルダにしておけば、入力フォルダは変える必要がない。上書きされた結果を確認するだけ。)
5. 詳細な検証はしていない。 例えば、テキスト全体が空白行で始まる場合は、その空白行は省略することになる。 その他、思わぬバグがある可能性がある。
以下、コードを示します。
Sub test() Dim fso As Object Dim fPath As String Dim myTxt As Variant Dim filename As String Dim filename2 As String Dim fno As Long Dim buf As String
Dim re As Object Dim matches As Object Dim m As Object Dim newline As String Dim newline2 As String Dim s1 As String Dim s2 As String Dim s As String Dim n As Long
'アウトプット形式 ''' ■■要選択 Const md As Long = 1 '' md(modeのつもり) 'Const md As Long = 2 'Const md As Long = 3
Set re = CreateObject("VBScript.RegExp") Set fso = CreateObject("Scripting.FileSystemObject")
fPath = "D:\MyDocuments\201509\test1" ''■要修正(入力ファイルのあるフォルダ名)
For Each myTxt In fso.GetFolder(fPath).Files filename = myTxt.Path
'全文をbufに取り込む fno = FreeFile Open filename For Input As fno buf = StrConv(InputB(LOF(fno), fno), vbUnicode) Close fno
'改行コード判定 If InStr(buf, vbCrLf) > 0 Then ' Windows newline = vbCrLf newline2 = "\r\n" n = 2 ElseIf InStr(buf, vbCr) > 0 Then ' Mac newline = vbCr newline2 = "\r" n = 1 Else ' Unix newline = vbLf newline2 = "\n" n = 1 End If
'書き込みファイルを開く filename2 = Replace(filename, "\test1\", "\test2\") '■要修正(書込先のフォルダをtest2に変更) 'filename2 = filename '■自分自身に書き込むならこちら
fno = FreeFile Open filename2 For Output As fno
With re .Global = True .Pattern = "((?:[^\r\n]+" & newline2 & ")+)" & "((?:" & newline2 & ")*)"
Set matches = .Execute(buf)
For Each m In matches s1 = m.SubMatches(0) '文章部分 s2 = m.SubMatches(1) '改行(複数あり)のみ 部分
' 改行を "</br>改行"に置換 s1 = Replace(Left(s1, Len(s1) - n), newline, "</br>" & newline)
Select Case md Case 1 s = "<p id=""num" & 1 + Len(s2) / n & """>" & newline & s1 & newline & "</p>" s = s & s2 Case 2 s = "<p id=""num" & 1 + Len(s2) / n & """>" & s1 & "</p>" s = s & s2 Case 3 s = "<p id=""num" & 1 + Len(s2) / n & """>" & newline & s1 & newline & "</p>" End Select
Print #fno, s; Print #fno, newline; Next End With Close fno Next End Sub
(γ) 2015/09/21(月) 14:32
To γさん
またまた眼福です。
お目に留まれば教えてください。 なるほどなぁと、セッセと、パクリライブラリーにため込んでいます。 1点、よろしければご教示お願いしたいのですが、パターンの (?:・・・) PERL のメタ文字説明の中に、グループ化のみを行いキャプチャーは行わない というのがありましたが、 それと同じと考えてよろしいでしょうか。
(β) 2015/09/21(月) 16:42
見直しますと、
"<p id=""num" & 1 + Len(s2) / n & """>"
などというのが何カ所も出てきたり、ずぶの素人まるだしで恐縮です。
>それと同じと考えてよろしいでしょうか。
はい、そのように考えております。
(γ) 2015/09/21(月) 18:39
『改行コードがあればpタグを挿入する、テキストフメx(まさみ) エクセル Excel [エクセルの学校]
https://www.excel.studio-kazu.jp/kw/20150922113921.html
γ様の【質問1】 【質問2】 【質問3】 【質問4】をはじめ、今まで回答できなかったものも、新しいスレが答えということになっていると思います。
【質問3】に関しては、参考URLにもあるように、margin-bottomを第一に考えていますが、CSSには、padding、画像など、ほかにも方法がたくさんあると思います。
一行一行を段落としてみなしてしまう<p id="num1">は、 採り得ないと思った。 だから、いわゆるbr方式のみ対応している
新しいスレでは、シンプルにするため、逆に、<p id="num1">方式のみにしています。これをCSSで調整すれば、実用上は何とかなりますし、そのような大手のサイトもあります。もしも、br方式にする必要を後で感じ場合、改めてほかの質問でさせて頂くかもしれません。<p id="num1">をbrに置換する処理を加えるだけなので簡単だと思います。
また、一日に何回かしかこの掲示板に来れないこともあるので、返信が遅いのはご了承ください。
いろいろ不適切な表現や、わかりにくい説明があり、大変申し訳ありません。
どうも、ありがとうございました。
(まさみ) 2015/09/22(火) 12:05
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.