• ベストアンサー

For Each ~ .split(vbCrLf)の中で条件分岐

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の判定ができません。 このままでは文字列として判定の条件には使えないのでしょうか?

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

  • ベストアンサー
  • herencia
  • ベストアンサー率56% (120/211)
回答No.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

K6A
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • locoyama
  • ベストアンサー率77% (7/9)
回答No.1

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

すると、全ての回答が全文表示されます。

関連するQ&A