VB.net用子串分割函数

时间:2014-02-13 17:09:42

标签: vb.net

我想读取字符串中的某个值。每一行都是一个新字符串,我想读取每一行的第6个整数..

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles browsebtn.Click
    If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
        Dim filename As String = OpenFileDialog1.FileName
        Dim streamreader As New System.IO.StreamReader(filename)
        Dim textfile As String = streamreader.ReadToEnd
        Dim splitChar As String = vbNewLine
        Dim day As Integer = textfile.Substring(10, 2)
        Dim strLine() As String = day.Split(splitChar)
        For Each line As String In strLine

            MsgBox(day)

        Next


    End If
End Sub
End Class

但它只返回一个数字。如果我将day设置为字符串而不是整数,则它完美无缺,除了它读取整个字符串,而不是我需要的两个整数。请帮忙。我做错了什么?

编辑:

输入文件如下所示:

23728 121010 00004986 00 00  2 21 22 11   447 114  2   382   292   350

23730 121010 00064120 00 00 51 19 21 12  1064 110  2  4500   572  7734 

我希望我的输出为:

10
10

10来自“121010”

3 个答案:

答案 0 :(得分:2)

您编写的所有代码都可以在更少的行中完成,如下所示:

For Each line As String In File.ReadAllLines(fileName)
    MessageBox.Show(line)
Next

与您的示例一样,它会将整个文件一次性加载到内存中,如果它是一个大文件,则可能会出现问题。如果文件的大小是一个问题,最好一次只读一行,如下所示:

Dim streamReader As New StreamReader(fileName)
Dim line As String = Nothing
Do
    line = streamReader.ReadLine()
    MessageBox.Show(line)
Loop Until line Is Nothing

然而,问题仍然存在,如何将线分割成各自的值。如果,如您在问题中显示的那样,值由空格分隔,那么您可以使用line.Split将行分隔为其所有值的数组。然后要获取其中一个值的最后两个字符,您可以使用String.SubString,如下所示:

Dim streamReader As New StreamReader(fileName)
Dim line As String = Nothing
Do
    line = streamReader.ReadLine()
    Dim parts() As String = line.Split()
    Dim wholeNumber As String = parts(1)
    Dim lastTwo As String = wholeNumber.SubString(wholeNumber.Length - 2)
    MessageBox.Show(lastTwo)
Loop Until line Is Nothing

答案 1 :(得分:1)

一些建议:

  1. 始终处置资源(最后使用或尝试使用 resource.close)

  2. 永远不会信任用户输入。

  3. 编写可以处理足够不良情况的代码

  4. 根据您的代码进行更正:

     Try
            Dim text As String = Nothing
    
            Using streamreader As New System.IO.StreamReader("text.txt")
                text = streamreader.ReadToEnd()
            End Using
            If IsNothing(text) = False Then
                Dim strLine() As String = text.Split(New String() {Environment.NewLine}, StringSplitOptions.None)
                For Each line As String In strLine
    
                    If line.Length > 12 Then MsgBox(line.Substring(10, 2))
                Next
            End If
        Catch ex As Exception
            'filenotfound case
        End Try
    

    另一种方式:

    在线输入可能不同的情况下(但在我们的情况下应该看第二个值)

    然后可以使用Regex

    以下是:

    Try
        Using streamreader As New System.IO.StreamReader(file)
            Dim line As String
            While streamreader.Peek > 0
                'unreaded line from file
                line = streamreader.ReadLine()
                'split input by non digits
                Dim numberstrs As String() = Regex.Split(line, "\D+")
                'second numbers last two
                If numberstrs.Length > 1 AndAlso numberstrs(1).Length > 2 Then
                    Console.WriteLine("{0}", numberstrs(1).Substring(numberstrs(1).Length - 2, 2))
                End If
    
            End While
    
    
        End Using
    Catch ex As Exception
    
    End Try
    

答案 2 :(得分:1)

史蒂文的回答让你大部分时间都可以,但不是一路走来。值得注意的是,你实际上并不想要第6个整数,因为它可能是1或2或几乎任何东西,具体取决于你如何切片。另外,在你的例子中,你说你想要从121010获得10,这可能是第二组的两个数字或者来自该部分字符串的第二组两个数字。

我注意到在你的示例字符串中你有一些双重空格:你需要对它进行排序才能启动,否则使用String.Split会给你数组中的空元素。实际上,使用上面使用的parts(5)作为Steven已经使用过了一个空元素,这要归功于双重空间,而这并不是你想要的。你需要parts(2),然后你需要SubString来获得你想要的数字。

另一种,我认为更优雅的方法是使用RegEx获取数字。假设您希望该字符串中的第二个10(以粗体显示):12 * 10 * 10。如果您知道该字符串将始终为6个字符,则始终是输入行中的第二个字段,并且您始终需要第三个和第四个数字,那么这样就可以了:

Imports System.Text.RegularExpressions
Imports System.IO

Private Sub ReadFile
    Dim rx As New Regex("^[^\s]+\s{1}\d{2}(\d{2}?)", RegexOptions.Compiled Or RegexOptions.CultureInvariant)
    Dim streamReader As New StreamReader(fileName)
    Dim line As String = String.Empty

    Do While streamReader.Peek >= 0
        line = streamReader.ReadLine()
        MessageBox.Show(rx.Matches(line)(0).Groups(1).Value)
    Loop 
End Sub

我不是说这是唯一的(或最优雅的)RegEx,但它会起作用,意味着你不必使用SubString,它不关心第一个字段有多长。它还假设字段之间有一个空格,但也可以更改为适合。只要你能够制定一个规则来达到你想要的位,你可以RegEx它。使用Expresso(免费且功能非常强大的实用程序)来帮助您构建合适的表达式。