3

我正在创建一个应该将文本写入文本文件的程序,并且应该能够从 VB 中的文本文件中读取特定行(因此,如果我需要读取特定名称,我可以选择第 5 行,它将显示在文本框)。我能够从文本文件中读取文本,但我不知道如何控制特定的行。

这是我的代码:

Public Class Form1

    Private Sub btnSubmit_Click(sender As System.Object, e As System.EventArgs) Handles btnSubmit.Click
         Dim writer As New System.IO.StreamWriter("/text.txt", True)
         writer.WriteLine(txtFirstName.Text)
         writer.WriteLine(txtLastName.Text)
         writer.WriteLine("-------------------------------------")
         writer.Close()
    End Sub

     Private Sub btnRead_Click(sender As System.Object, e As System.EventArgs) Handles btnRead.Click
        Dim reader As New System.IO.StreamReader("/text.txt")
        Dim FirstName, LastName As String
        FirstName = reader.ReadLine()
        LastName = reader.ReadLine()
        reader.Close()
        txtFirstName.Text = FirstName
        txtLastName.Text = LastName
    End Sub

    Private Sub btnClear_Click(sender As System.Object, e As System.EventArgs) Handles btnClear.Click
        txtFirstName.Clear()
        txtLastName.Clear()
    End Sub
End Class

任何帮助,将不胜感激。谢谢!

4

6 回答 6

13

您必须阅读所有行,直到您感兴趣的行。例如:

Function ReadLineWithNumberFrom(filePath As String, ByVal lineNumber As Integer) As String
    Using file As New StreamReader(filePath)
        ' Skip all preceding lines: '
        For i As Integer = 1 To lineNumber - 1
            If file.ReadLine() Is Nothing Then
                Throw New ArgumentOutOfRangeException("lineNumber")
            End If
        Next
        ' Attempt to read the line you're interested in: '
        Dim line As String = file.ReadLine()
        If line Is Nothing Then
            Throw New ArgumentOutOfRangeException("lineNumber")
        End If
        ' Succeded!
        Return line 
    End Using
End Function

这是因为文本行是可变长度记录,并且无法猜测特定行开始的确切文件偏移量——除非没有索引。

如果您经常需要加载特定行,您还有更多选择:

  • 将完整的文本文件加载到内存中,例如使用File.ReadAllLines("Foobar.txt"). 这将返回一个String()数组,您可以直接按行号访问该数组。

  • 手动创建行号索引。也就是说,逐行处理一个文本文件,并在Dictionary(Of Integer, Integer)执行过程中填写一个。键是行号,值是文件偏移量。这使您可以.Seek直接到特定行的开头,而不必将整个文件保存在内存中。

于 2013-03-29T18:01:54.063 回答
6

试试这个:

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Dim reader As New System.IO.StreamReader("C:\text.txt")
    Dim allLines As List(Of String) = New List(Of String)
    Do While Not reader.EndOfStream
        allLines.Add(reader.ReadLine())
    Loop
    reader.Close()
    txtFirstName.Text = ReadLine(5, allLines)
    txtLastName.Text = ReadLine(6, allLines)

End Sub

Public Function ReadLine(lineNumber As Integer, lines As List(Of String)) As String
    Return lines(lineNumber - 1)
End Function

如果你有这个文件:

Line 1
Line 2
Line 3
Line 4
My Name
My LastName

您的姓名文本框将包含“我的姓名”,您的姓氏文本框将包含“我的姓氏”。

于 2013-03-29T18:06:00.697 回答
4

这很简单,试试这个:

Dim strLineText As String
Dim intLineNumber As Integer
LineNumber=3

myLine = File.ReadAllLines("D:\text.txt").ElementAt(LineNumber).ToString
于 2017-05-14T13:40:56.077 回答
0

另一种选择

    Private Function readNthLine(fileAndPath As String, lineNumber As Integer) As String
    Dim nthLine As String = Nothing
    Dim n As Integer
    Try
        Using sr As StreamReader = New StreamReader(fileAndPath)
            n = 0
            Do While (sr.Peek() >= 0) And (n < lineNumber)
                sr.ReadLine()
                n += 1
            Loop
            If sr.Peek() >= 0 Then
                nthLine = sr.ReadLine()
            End If
        End Using
    Catch ex As Exception
        Throw
    End Try
    Return nthLine
End Function
于 2013-10-03T17:01:47.843 回答
0

我试过了,效果很好。在 test.txt 中使用 VB Express 内容:

line1
line2
1
John

然后以我添加的形式

textbox1
textbox2
label1
label2

和一个button

按钮内的代码:

     Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
        Dim myLine As String
        Dim lineNumber0 As Integer
        lineNumber0 = 0
        Dim lineNumber1 As Integer
        lineNumber1 = 1
        Dim lineNumber2 As Integer
        lineNumber2 = 2
        Dim lineNumber3 As Integer
        lineNumber3 = 3

        TextBox1.Text=File.ReadAllLines("D:\test.txt").ElementAt(lineNumber0).ToString
        TextBox2.Text=File.ReadAllLines("D:\test.txt").ElementAt(lineNumber1).ToString
        Label1.Text = File.ReadAllLines("D:\test.txt").ElementAt(lineNumber2).ToString
        Label2.Text = File.ReadAllLines("D:\test.txt").ElementAt(lineNumber3).ToString

    End Sub
于 2019-07-30T22:08:59.010 回答
0

这是一个简单但有效的解决方案:

Dim Reader As String = System.IO.File.ReadAllLines("C:\File.txt")(1)
MsgBox("Line 1: " + Reader)

The MsgBox should show the first line of C:\File.txt.

于 2021-10-03T07:55:19.007 回答