2014-02-13 76 views
0

我想讀取字符串中的某個值。每行是一個新的字符串,我想讀取每行上的第6個整數。VB.net與子字符串拆分功能

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

向我們顯示輸入(您的文本文件)和所需的輸出?還請注意使用塊 – qwr

+0

我將其添加到我的問題中。謝謝 –

+0

那麼,你如何確定「10」開始和結束的位置?這是第六個整數? –

回答

1

幾點建議:

  1. 使用總是配置資源(使用或試圖趕上最後用 resource.close)

  2. 絕不信任用戶輸入。

  3. 寫代碼,可以根據您的代碼處理足夠的不希望的情況下

更正:

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 
+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 
+0

第二個建議適用於閱讀每一行。但line.split沒有。我收到警告..「索引超出了陣列的範圍。」我將5改爲11,它顯示了第一個數字,然後當它試圖讀取下一個時,它再次給了我警告。 –

+0

感謝您的回答,@qwr給我的答案奏效了。 –

1

史蒂芬的回答讓你最那裏,但不是這樣一路。值得注意的是,你實際上並不想要第6個整數,因爲它可能是1或2或幾乎任何東西,這取決於你如何分割它。另外,在你的例子中,你說你想從121010中得到10,這可能是從該字符串的該部分的第二組兩個數字或第三組兩個數字。

我注意到在你的示例字符串中你有一些雙空格:你需要將它排序,否則使用String.Split會給你數組中的空元素。實際上,使用parts(5)就像Steven上面使用的那樣,由於雙倍空間的原因,給了你一個空的元素,而這不是你想要的。你會想要parts(2),然後你需要SubString來獲得你想要的數字。

另外,我認爲更優雅的方法是使用RegEx來獲取數字。假設您想要該字符串中的第二個10(以粗體顯示):12 * * 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 

我不是說這是唯一(或最優雅的)正則表達式,但它會工作,並且意味着你不必使用SubString,它不關心第一個字段有多長。它也假定字段之間有一個單獨的空間,但也可以根據需要進行更改。只要你能制定一條規則來達到你想要的位置,你可以RegEx它。使用Expresso(免費且功能強大的實用程序)可幫助您構建合適的表達式。

+0

感謝您的回答,我試過這個,我得到一個錯誤「指定的參數超出了有效值的範圍。」 –

+0

@DylandeStPern你應該自己進行範圍檢查。實際上,這是正確的方式,特別是如果輸入可能不同或將由用戶提供。 – qwr

+0

輸入將始終相同。它是一個日誌文件,將日期保存爲121010。 2012年10月10日。它將始終以這種格式。 –