2017-01-30 4 views
0

У меня есть строковой переменной, как:VB.net петли и Сплит функции обработки текста

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

с этим кодом

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 

И я хочу, чтобы показать TextBox4:

X

Y

х

Y

.......

Но я только получаю:

х

х

х

...

Где проблема?

+0

см мой ответ, чтобы найти то, что случилось с вашим кодом и как исправить их –

ответ

0

Если я хочу, чтобы не изменить свой код, но только настроить его ошибка, это мой ответ:

При использовании Do Until x = N и вы увеличите x в конце loop, последнее значение x не будет передавать условие, указанное вами в начале цикла, и поэтому не будет выполнено.

Ваши петли ошибочны: ваше конечное условие не указано правильно (.... Длина - 1 на один меньше, чем последний элемент, потому что). Также счетчики numj и numk сбрасываются на ноль при начальных внутренних циклах.

Измените код следующим образом:

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