みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

ダブルクォーテーション付きの文字列を含むファイルを読み込む方法?

Visual Basic 2008 Express Editionを使用しています。

IE上の範囲選択のHTMLテキストをテキストファイルに保存しています。
保存日時(Date型):time "文字列":moji のように保存しています。
FileOpen(n, "Data.dat", OpenMode.Append)
 WriteLine(n, time, moji)

~保存されたファイルの例~
#2008-08-31 10:21:05# , "この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームが表示されます。通常のご質問、ご意見等は<A
href=""/vb/bbs/index.html"">掲示板</A>へご投稿ください。
"
このファイルを以下のように読み込もうとしています。
FileOpen(n, "Data.dat", OpenMode.Input)
Do While Not EOF(n)
Input(n, time)
Input(n, moji)
TextBox1.Text += vbCrLf & time & vbCrLf & moji & vbCrLf
Loop

 ところが、HTMLの文字配列の中には、<a href="" http://・・・・ "">のようにダブルクォーテーションが含まれています。ダブルクォーテーションが2つなら、文字列として扱ってもらえると思っていましたが、文字列の終了位置として認識してしまうようです(エラーの内容から判断しました。)

ダブルクォーテーションを含む文字列の場合どのように処理したらよいでしょうか?

投稿日時 - 2008-08-31 11:28:26

QNo.4292455

困ってます

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

あの?。聞きたいんだけど。
最終的な結論から言うと、どうもウエーブのページを時刻とページ内容を対にして
保存しているみだいですね。一種のログファイル的な考え方と思っていいですか?。
その時にウエーブのページの内容によって ファイルに保存した時に vbCrLf が入る
みたいで、それで今度読み込みする時に困るとの事。vbCrLf が途中に入っていな
いなら、私の答えた内容で綺麗に読めるはずです。

FileOpen(1, "C:\sbj\aaaa.txt", OpenMode.Input)
Do While Not EOF(1)
  time=Input(1)       こちらを Input で
  moji=lineInput(1)     こちらを LineInput で
Loop

そこで、ウエーブのページを保存する時にvbCrLfが入らない様にすればいいのだけど。
ここで考えられるのは、ダブルクォーテーションがついている内容を保存した変数を
ファイルに書き込む時に、VBが勝手にvbCrLf をつけて保存する事はないと思うが?。

恐らく想像だが、ダブルクォーテーションがついている内容を保存した変数をファイル
に書き込む時点でvbCrLfがつくのではなくて、ファイルに書き込む以前に、既に
そのダブルクォーテーション文字を含んだ変数の中にvbCrLfの文字があるのでは?。
書き込む前に変数にvbCrLfがあれば、vbCrLfも同時に書き込まれます。

本来、ウエーブページの内容は、vbCrLfがページ内に含まれていても、無視されて
改行しない様になっており、ウエーブページの改行は<br>だった様に思う。

むしろ、ウエーブページの内容はいたる所にvbCrLfが入っている可能性が大であり
、いくら入っていてもウエーブページにはなんら差し支えない様に出来ています。

それ故、ウエーブページの内容を時刻と対に保存する時は、保存する前にウエーブページ
の保存してある変数から、vbCrLfを取り除いて保存するのが普通です。
そうでないとvbCrLfがどこに入るか分からなく、その後の読み込んで操作するプログラム
の方で大変難しくなるからです。

ファイルに保存する前に 保存する変数を 

変数=replace(変数,vbCrLf,"") として vbCrLf を取り除いて保存すれば vbCrLf
は途中に入らない様に思うのですが?。一度試して頂けますか?

投稿日時 - 2008-09-05 12:29:36

お礼

変数=replace(変数,vbCrLf,"") とすると、
改行がなくなり無事読み込むことができました。

私の質問に長くお付き合いしていただきありがとうございました。またよろしくお願いします。

投稿日時 - 2008-09-06 20:44:51

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

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

回答(4)

ANo.3

ダブルクォーテーション付きの文字列を含むファイルを読み込む方法はとなっているので

それなら、

FileOpen(1, "C:\sbj\aaaa.txt", OpenMode.Input)
Do While Not EOF(1)
  time=Input(1)       こちらを Input で
  moji=lineInput(1)     こちらを LineInput で
Loop

でよいですと伝えています。ただし

#2008-08-31 10:21:05#, 文字列(ダブルクォーテーションを含む) vbCrLF

の形でファイルに保存されていないといけないが、上の形でファイルの中が落ちていないのですか?

サンプルのデータは


#2008-08-31 10:21:05# , "この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームが表示されます。通常のご質問、ご意見等は<A
href=""/vb/bbs/index.html"">掲示板</A>へご投稿ください。

で、

 #2008-08-31 10:21:05#,"この記事・・・ご意見等は<A vbCrLf  <===ここで改行
 href=""/vb/bbs/index.html"">掲示板</A>へご投稿ください。

 と文字列の途中で改行文字が入っていますが、この改行文字をどうこうするとの事なのですか?

上の読み込むファイルを作るソースがどの様になっているのかわかりませんが、
それは、元の読み込むファイルを作るソースの問題ではないのですか?。

質問内容からは、ダブルクォーテーション付きの文字列を含むファイルを読み込む方法はとなっているので
その様に答えていますが。

それなら、質問内容は、ファイルを書き込む時に ダブルクォーテーションを含む文字列を書き込む時に
途中で改行文字が入るのを入らない様にしたいとの事ではないのですか?。

投稿日時 - 2008-09-03 23:32:19

補足

ご回答ありがとうございます。

ご指摘の通り、WriteLineで時間(Date型)、文字列(String型)を保存していますが、テキストファイルを開いてみると、途中に改行文字が多く入っていました。

質問当初は、改行文字が入っていることには気づかず、input関数で読み込もうとしていましたので、いつもダブルクォーテーションのところでエラーが起こっていました。

投稿日時 - 2008-09-04 21:00:54

ANo.2

時間と文字の2項目で読みたいことですか?

それなら下の内容でどうですか?。

FileOpen(1, "C:\sbj\aaaa.txt", OpenMode.Input)
Do While Not EOF(1)
  time=Input(1)       こちらを Input で
  moji=lineInput(1)     こちらを LineInput で
Loop

投稿日時 - 2008-09-02 18:46:23

補足

ウェブページのinnerHTMLを抜き出して文字列変数に入れていますが、テキストファイルに保存した段階で、改行文字が途中で書き込まれてしまうようで、それでうまくいきません。

以前教えていただいたlininput(1)だけで読み取りをしても、うまくいかなくなってしまいました。前はうまくいっていたような気もしましたが。

投稿日時 - 2008-09-03 20:37:08

ANo.1

行単位で読み込みすれば、そのままダブルクォーテーション
も読み取れます。

FileOpen(1, "C:\sbj\aaaa.txt", OpenMode.Input)
Do While Not EOF(1)
  cm=lineInput(1)
  cm=lineInput(1)
Loop

投稿日時 - 2008-08-31 19:40:43

補足

ご回答ありがとうございます。
試してみましたところ、行単位で読み取れました。

ただ、質問分が少し曖昧だったため、少し目的のこととは違いました。

 時間と文字列の配列をファイルに保存して、読み込むときもまた2つの変数に分けて読み込みたいと思っています。
 ためしに、Writeで書き込んで、Inputで読み込んでみましたが、やはりダブルクォーテーションが含まれるとうまくいきませんでした。

 また、回答文ではcm=linInput(1)を2行記されていますが、これは誤植だと思っていますがどうでしょうか?

よろしくお願いします。

投稿日時 - 2008-09-02 08:26:58