vb.netwinformsfile.readalllines

vb.net readalllines fill form replace certain lines coding advice


What I'm trying to accomplish is reading a text file and selecting certain lines to modify by filling in text from a second form. Here is an example the code I'm currently using. What's happening is I'm looking for a line that starts with 718 and then somewhere after that line there will be a line that starts with 720. I need both lines to fill in the second form. The only way I can think of is to just keep adding 1 to the line until it reaches the line I need. I'm still new to this and I'm sure there's an easier way to do this maybe using Try or While but I'm not sure how. Appreciate any help.

Dim lines() As String = File.ReadAllLines(tempsave)
For i As Integer = 0 To lines.Length - 1
If lines(i).StartsWith("718") Then
  If lines(i + 1).StartsWith("720") Then
       Dim array() As String = lines(i).Split("*"c, "~"c)
       Dim array2() As String = lines(i + 1).Split("*"c, "~"c)
       FormFill.TextBox1.Text = array(3)
       FormFill.TextBox2.Text = array(9)
       FormFill.ShowDialog()
       lines(i) = lines(i).Replace(array(3), FormFill.TextBox1.Text)
       lines(i + 1) = lines(i + 1).Replace(array(9), FormFill.TextBox2.Text)
  Else
       If lines(i + 2).StartsWith("720") Then
           Dim array() As String = lines(i).Split("*"c, "~"c)
           Dim array2() As String = lines(i + 2).Split("*"c, "~"c)
           FormFill.TextBox1.Text = array(3)
           FormFill.TextBox2.Text = array(9)
           FormFill.ShowDialog()
              lines(i) = lines(i).Replace(array2(3),FormFill.TextBox1.Text)
              lines(i + 2) = lines(i + 2).Replace(array(9), FormFill.TextBox2.Text)
       End If
   End If
End If
Next

Example Data:

Input:
123*test*test*test~
718*test*test*test~
543*test*test*test~
720*test*test*test~

Output:
123*test*test*test~
718*test*test*newdata~
543*test*test*test~
720*test*test*newdata~

Solution

  • Here, try this:

    Public Sub Lines()
      Dim _
        aNextLines,
        aAllLines As String()
    
      Dim _
        s718Line,
        s720Line As String
    
      aAllLines = IO.File.ReadAllLines("D:\Logs\Data.log")
    
      For i As Integer = 0 To aAllLines.Length - 1
        If aAllLines(i).StartsWith("718") Then
          s718Line = aAllLines(i)
          aNextLines = aAllLines.Skip(i + 1).ToArray
          s720Line = aNextLines.FirstOrDefault(Function(Line) Line.StartsWith("720"))
    
          ' Process data here
    
        End If
      Next
    End Sub
    

    --UPDATE--

    Here's a modified version that both reads and writes:

    Public Sub Lines()
      Dim oForm As FormFill
    
      Dim _
        aNextLines,
        aAllLines As String()
    
      Dim _
        i718Index,
        i720Index As Integer
    
      Dim _
        s718Line,
        s720Line As String
    
      oForm = New FormFill
    
      aAllLines = IO.File.ReadAllLines(oForm.FilePath)
      s718Line = String.Empty
      s720Line = String.Empty
    
      For i718Index = 0 To aAllLines.Length - 1
        If aAllLines(i718Index).StartsWith("718") Then
          s718Line = aAllLines(i718Index)
          aNextLines = aAllLines.Skip(i718Index + 1).ToArray
    
          For i720Index = 0 To aNextLines.Length - 1
            If aNextLines(i720Index).StartsWith("720") Then
              s720Line = aNextLines(i720Index)
    
              Exit For ' Assumes only one 720 line in the file
            End If
          Next
    
          Exit For ' Assumes only one 718 line in the file
        End If
      Next
    
      oForm.TextBox718.Text = s718Line
      oForm.TextBox720.Text = s720Line
    
      oForm.TextBox718.Tag = i718Index
      oForm.TextBox720.Tag = i720Index
    End Sub
    

    Now, in your Save button's Click event handler:

    Private Sub SaveButton_Click(Sender As Button, e As EventArgs) Handles SaveButton.Click
      Dim aAllLines As String()
    
      Dim _
        i718Index,
        i720Index As Integer
    
      Dim _
        s718Line,
        s720Line As String
    
      s718Line = Me.TextBox718.Text
      s720Line = Me.TextBox720.Text
    
      i718Index = Me.TextBox718.Tag
      i720Index = Me.TextBox720.Tag
    
      aAllLines = IO.File.ReadAllLines(Me.FilePath)
    
      aAllLines(i718Index) = s718Line
      aAllLines(i720Index) = s720Line
    
      IO.File.WriteAllLines(Me.FilePath, aAllLines)
    End Sub
    

    That should do it.