2017-01-30 18 views
0

私のように文字列変数を持っています。このコードVB.netループとSplit関数のテキスト処理

Dim p_text As String 
Dim s1_texts As String() 
Dim s2_texts As String() 
Dim s3_texts As String() 

s1_texts = Split(p_text, "}{") 
Dim numi As Integer = 0 
Dim numj As Integer = 0 
Dim numk As Integer = 0 

Do Until numi = s1_texts.Length - 1 
    If s1_texts(numi) = "" Then 
     numi += 1 
    Else 
     s2_texts = Split(s1_texts(numi), ",") 
     Do Until numj = s2_texts.Length - 1 
      If s2_texts(numj) = "" Then 
       numj += 1 
      Else 
       s3_texts = Split(s2_texts(numj), "=") 
       Do Until numk = s3_texts.Length - 1 
        TextBox4.Text = TextBox4.Text & s3_texts(numk) & vbCrLf 
        numk += 1 
       Loop 
       numj += 1 
      End If 
     Loop 
     numi += 1 
    End If 
Loop 

p_text = "}{X=45,Y=65}{X=59,Y=65}{X=59,Y=79}{X=45,Y=79}{" 

そして、私はTextBox4を表示する:

X

y

X

Y

.......

しかし、私は唯一取得しています:

X X

X

...

どこに問題がありますか?

+0

あなたのコードの何が問題とどのようにそれらに –

答えて

0

私はあなたのコードを変更するだけで、そのバグを調整しないようにしたい場合は、これが私の答えです:

あなたがDo Until x = Nを使用すると、あなたが最後にxを高めますループの最後の値は、ループの最初に指定した条件に合格しないため、実行されません。

ループに間違いがあります:終了条件が正しく指定されていません(....長さ-1は最後の項目よりも1少ないためです)。また、numjnumkカウンタは、内部ループの開始時にゼロにリセットされなければならない。

は、次のようにコードを変更します。

s1_texts = Split(p_text, "}{") 
Dim numi As Integer = 0 
Dim numj As Integer = 0 
Dim numk As Integer = 0 

Do Until numi = s1_texts.Length '- 1 => *** removed! 
    If s1_texts(numi) = "" Then 
     numi += 1 
    Else 
     s2_texts = Split(s1_texts(numi), ",") 
     numj = 0 '*** reset counter to 0 
     Do Until numj = s2_texts.Length '- 1 => *** removed! 
      If s2_texts(numj) = "" Then 
       numj += 1 
      Else 
       s3_texts = Split(s2_texts(numj), "=") 
       numk = 0 '*** reset counter to 0 
       Do Until numk = s3_texts.Length '- 1 => *** removed! 
        TextBox4.Text = TextBox4.Text & s3_texts(numk) & vbCrLf 
        numk += 1 
       Loop 
       numj += 1 
      End If 
     Loop 
     numi += 1 
    End If 
Loop 

、それはあなたが望むものを生成します。

しかし、あなたはFor-Nextループを使用している場合、それはより簡単なことができます

s1_texts = Split(p_text, "}{") 
Dim numi, numj, numk As Integer 

For numi = 0 To s1_texts.Length - 1 
    If s1_texts(numi) <> "" Then 
     s2_texts = Split(s1_texts(numi), ",") 
     For numj = 0 To s2_texts.Length - 1 
      If s2_texts(numj) <> "" Then 
       s3_texts = Split(s2_texts(numj), "=") 
       For numk = 0 To s3_texts.Length - 1 
        TextBox4.Text = TextBox4.Text & s3_texts(numk) & vbCrLf 
       Next 'numk 
      End If 
     Next 'numj 
    End If 
Next 'numi 

注:ここでは、条件のため... .Length - 1を使用する必要があります。

0

(ループの問題に直接は触れていませんが)

これは役に立ちます。 Split()関数は複数の文字を受け入れることができます。したがって、あなたは、単に行うことができます:

Sub Main() 

    ' Original string 
    Dim p_text = "}{X=45,Y=65}{X=59,Y=65}{X=59,Y=79}{X=45,Y=79}{" 

    ' String array split 
    Dim p_text_new = p_text.Split("}"c, "{"c, "="c, ","c) 

    ' Iterate through each string in array 
    For Each p In p_text_new 

     ' Check to ensure you don't print empty spaces 
     If Not String.IsNullOrWhiteSpace(p) Then 
      Console.WriteLine(p) ' p is the value you want.... 
     End If 

    Next 

End Sub 
+0

おかげで多くのことを修正するために見つけるために、私の答えを参照してください。それは私の仕事でした:-) – nsssayom

+0

注:これは '} {' chars ...のシーケンスをチェックしません。元のコードはある種のバリデーションを持っています(ただし、バリデーションは完全ではありませんが、 –

1

それとも、ただ新しい行ですべての英数字以外の文字を置き換えることができます。

TextBox4.Text = Regex.Replace(p_text, "\W+", vbNewLine).Trim