アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB.NETでテキストファイルを読み込み、行頭が指定の文字列だったら処理をしたいです。
下記のような感じ(だいぶ端折ってますが)でやってみましたがうまくいきません。

Dim sr As New System.IO.StreamReader( テキストファイル名 , System.Text.Encoding.GetEncoding("Shift-JIS"))
Dim Buffer As String = sr.ReadToEnd

'行ごとに分割して判定
For Each TextLine as String In Buffer.Split(vbCrLf)
  MsgBox(TextLine)
  If TextLine Like "○○○*" Then
    '実行したい処理
  End IF
NEXT

メッセージボックスの表示では正常に1行ずつ取り出せていますがIfの判定ができません。
このままでは文字列として判定の条件には使えないのでしょうか?

A 回答 (2件)

Likeに引っかからないのは、


「For Each TextLine as String In Buffer.Split(vbCrLf)」
で取得した文字列にvbCrLfが含まれているからです。

デバッグモードでTextLineの文字列を調べるとわかると思います。(メッセージボックスやウォッチウィンドウでは改行が省略して表示されてしまうのかvbCrLfが先頭にあるように見えませんが、コード上の変数の上にカーソルを持っていくと改行が先頭に入っているのがわかります)

解決方法は、
方法1 ファイルを一行ずつ読み込む(sr.ReadLine)
方法2 Splitした後にvbCrLfを削除する。
方法3 Splitして一行ずつ取り出すのではなく、StringReaderクラスを利用する。

最初にファイル内容を一括で読み込んでおられるので、方法3の例を下記に記しておきます。

Dim Buffer As StringReader
Dim TextLine As String

Buffer = New StringReader(sr.ReadToEnd)
'行ごとに分割して判定
Do
TextLine = Buffer.ReadLine()
If TextLine = Nothing Then Exit Do

Debug.WriteLine(TextLine)
If TextLine Like "(info)*" Then
'実行したい処理
Debug.WriteLine("Like に引っかかった")
End If
Loop
    • good
    • 0
この回答へのお礼

ご指摘の点を確認したところ、先頭にLfがついていました。
Split()の区切り文字がvbCrLfだと2文字になってしまうのが悪いのかと思い、読み込み後にBuffer.Replace(vbCrLf,vbLf)としてから区切り文字vbLfで同じ処理を実行したところ正常に動作しました。
まだ統合開発環境の使い方もよく分からない状態でしたので助かりました。
ありがとうございました。

お礼日時:2005/09/27 14:29

Like 演算子は使った事が無いので分かりませんが、


行頭が指定の文字列だったらと言う条件でしたら
StringクラスのStartsWithメソッドを使用されては
いかがでしょうか?

Public Function StartsWith( _
ByVal value As String _
) As Boolean

パラメータ
value
シークする String 。
戻り値
value がこの文字列の先頭と一致するかまたは Empty である場合は true 。それ以外の場合は false 。

--------

行ごとに分割して判定
For Each TextLine as String In Buffer.Split(vbCrLf)
  MsgBox(TextLine)
  If TextLine.StartsWith("○○○") Then
    '実行したい処理
  End IF
NEXT
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!