Nick
Nick

Reputation: 165

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~

Upvotes: 0

Views: 170

Answers (1)

InteXX
InteXX

Reputation: 6377

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.

Upvotes: 1

Related Questions