我想读取字符串中的某个值。每一行都是一个新字符串,我想读取每一行的第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”
答案 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)
一些建议:
始终处置资源(最后使用或尝试使用 resource.close)
永远不会信任用户输入。
编写可以处理足够不良情况的代码
根据您的代码进行更正:
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(免费且功能非常强大的实用程序)来帮助您构建合适的表达式。