Вопрос:
Я создаю программу, которая должна писать текст в текстовый файл, и должна иметь возможность читать определенные строки из текстового файла в 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
Любая помощь будет оценена по достоинству. Благодарю!
Лучший ответ:
Вам нужно будет прочитать все строки до того, что вам интересно. Например:
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 право на начало определенной строки, не сохраняя весь файл в памяти.
Ответ №1
Попробуй это:
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
ваше текстовое поле будет иметь имя “My Name”, а ваше текстовое поле LastName будет иметь “My LastName”.
Ответ №2
Это очень просто, попробуйте следующее:
Dim strLineText As String Dim intLineNumber As Integer LineNumber=3 myLine = File.ReadAllLines(«D:text.txt»).ElementAt(LineNumber).ToString Ответ №3
Еще один вариант
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