简体   繁体   中英

Visual Basic Parsing

Ok so I'm working on a program that parses input in the textbox and finds a delimiter such as a comma, space, or a line pressed using enter key and extracting each word before each delimiter and posting it in the listbox. I keep getting errors though.

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim delimiter As String = ""
Dim oldIndex As Integer = 0
Dim newIndex As Integer = 0
Dim length As Integer = 0
Dim tempString As String = ""
Dim tempWord As String = ""
Dim advanceSize As Integer = 0

If RadioButton1.Checked = True Then
    delimiter = ","
    advanceSize = 1
    tempString = TextBox1.Text
    length = tempString.Length
    Do While oldIndex < length
        newIndex = tempString.IndexOf(delimiter)
        tempWord = Mid(tempString, oldIndex, newIndex)
        tempWord.Trim()
        oldIndex = newIndex + advanceSize
        ListBox1.Items.Add(tempWord)
    Loop
ElseIf RadioButton2.Checked = True Then
    delimiter = vbCrLf
    advanceSize = 2
    tempString = TextBox1.Text
    length = tempString.Length
    Do While oldIndex < length
        newIndex = tempString.IndexOf(delimiter)
        newIndex = tempString.IndexOf(delimiter)
        tempWord = Mid(tempString, oldIndex, newIndex)
        tempWord.Trim()
        oldIndex = newIndex + advanceSize
        ListBox1.Items.Add(tempWord)
    Loop
ElseIf RadioButton3.Checked = True Then
        delimiter = " "
        advanceSize = 1
        tempString = TextBox1.Text
        length = tempString.Length
    Do While oldIndex < length
        newIndex = tempString.IndexOf(delimiter)
        newIndex = tempString.IndexOf(delimiter)
        tempWord = Mid(tempString, oldIndex, newIndex)
        tempWord.Trim()
        oldIndex = newIndex + advanceSize
        ListBox1.Items.Add(tempWord)
    Loop
Else
            Exit Sub

In the first line read, the value of oldindex is zero. The Mid function requires a number greater than zero for the second parameter because, unlike the string.substring method, it is one-based rather than zero-based. The error will be resolved if you initialize oldindex to 1.

Incidentally, the third parameter of mid (and .substring) is length, not an ending index.

May I suggest an alternative which achieves the goal of your question? There is a String.Split function which you can use. It's a bit fiddly, as to split on a string you need to use an array of strings (there can be just one in the array, which is all we need) and you have to specify a StringSplitOptions value, but apart from that it is easy to use:

Private Sub bnSplitData_Click(sender As Object, e As EventArgs) Handles bnSplitData.Click
    Dim txt = tbDataToSplit.Text
    Dim delimiter As String() = Nothing

    ' select case true is an easy way of looking at several options:
    Select Case True
        Case rbCommas.Checked
            delimiter = {","}
        Case rbNewLines.Checked
            delimiter = {vbCrLf}
        Case rbSpaces.Checked
            delimiter = {" "}
        Case Else ' default value
            delimiter = {","}
    End Select

    Dim parts = txt.Split(delimiter, StringSplitOptions.RemoveEmptyEntries)
    ' get rid of the old entries
    ListBox1.Items.Clear()
    ' add the new entries all in one go
    ListBox1.Items.AddRange(parts)

End Sub

Please note how I gave the controls (except ListBox1) meaningful names - it makes referring to the correct one much easier.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM