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()これは、行番号で直接アクセスできる配列を返します。

  • 行番号インデックスを手動で作成します。つまり、テキスト ファイルを 1 行ずつ処理し、その都度 a に入力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 に答える
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 に答える