【问题标题】:how to read two text file line by line in vb.net simultaneously如何同时在vb.net中逐行读取两个文本文件
【发布时间】:2015-01-20 15:59:55
【问题描述】:

帮助!

我想同时读取两个文本文件,我可以逐行读取一个文本文件,但是当我添加一个要同时读取的文本文件时,它只读取第一行,仅此而已..

例如:

在 name.txt 中有

在 age.txt 中有

我想同时阅读它们,以便我可以将它们与其相应的名称和年龄一起保存到数据库中..

这是我的代码:

Public Sub ReadName()
    On Error Resume Next
    Dim FileReader As System.IO.StreamReader
    FileReader = My.Computer.FileSystem.OpenTextFileReader(des & "\name.txt")
    Dim stringReader As String
    stringReader = FileReader.ReadLine
    txtName.Text = stringReader
    FileReader.Close()
End Sub

和年龄相同的代码

Public Sub ReadAge()
    On Error Resume Next
    Dim FileReader As System.IO.StreamReader
    FileReader = My.Computer.FileSystem.OpenTextFileReader(des & "\age.txt")
    Dim stringReader As String
    stringReader = FileReader.ReadLine
    txtAge.Text = stringReader
    FileReader.Close()
End Sub

我已经尝试了 γηράσκω δ' αεί πολλά διδασκόμε 提供的代码,但唯一会显示在文本框中的值是最后一个值。我只想在每次读取每一行时在文本框中显示它。我把它放在计时器中,当表单加载时,计时器将被启用..

Dim FileReaderName, FileReaderAge As System.IO.StreamReader
    FileReaderName = My.Computer.FileSystem.OpenTextFileReader("C:\Users\toshiba\Desktop\from sky\name.txt")
    FileReaderAge = My.Computer.FileSystem.OpenTextFileReader("C:\Users\toshiba\Desktop\from sky\age.txt")

    Dim nameReader, ageReader As String

    Do While FileReaderName.Peek() >= 0 And FileReaderAge.Peek() >= 0
        nameReader = FileReaderName.ReadLine
        ageReader = FileReaderAge.ReadLine

        TextBox1.Text = nameReader
        TextBox2.Text = ageReader
    Loop

    FileReaderName.Close()
    FileReaderAge.Close()

【问题讨论】:

    标签: vb.net streamreader


    【解决方案1】:

    如果文本文件不是太大,您可以通过一次阅读所有文件来简化任务。

    使用ReadAllLines 将所有行提取到一个数组中:

    Dim Names() As String = IO.File.ReadAllLines(IO.Path.Combine(des, "name.txt"))
    Dim Ages() As String = IO.File.ReadAllLines(IO.Path.Combine(des, "age.txt"))
    

    然后只是迭代:

    For i = 0 To Math.Min(Names.Count, Ages.Count) - 1
       'Add Names(i) and Ages(i) to database
    Next
    

    【讨论】:

    • 所以这意味着我只能将此代码用于不太大的数据?如果每个文件有 50 行或更多行,我也可以使用这种方法吗?
    • 是的。如果您的文本文件达到数百兆字节的范围,您应该开始担心并仔细评估性能和资源,但在大多数情况下没有问题。
    • 如果我希望它首先显示在文本框中,我该怎么办?每次读取每一行?
    【解决方案2】:

    打开两个文件并循环执行:

    Dim nameReader, ageReader As String
    
    'loop through all lines
    nameReader = FileReaderName.ReadLine
    ageReader = FileReaderAge.ReadLine
    

    编辑

    Dim FileReaderName, FileReaderAge As System.IO.StreamReader
    FileReaderName = My.Computer.FileSystem.OpenTextFileReader(des & "\name.txt")
    FileReaderAge = My.Computer.FileSystem.OpenTextFileReader(des & "\age.txt")
    
    Dim nameReader, ageReader As String
    
    Do While FileReaderName.Peek() >= 0 And FileReaderAge.Peek() >= 0
        nameReader = FileReaderName.ReadLine
        ageReader = FileReaderAge.ReadLine
        'Do what you want with nameReader, ageReader 
    
    Loop
    
    FileReaderName.Close()
    FileReaderAge.Close()
    

    EDIT2

    backgroundworker 添加到您的form。在您的form load 活动中:

    BackgroundWorker1.WorkerReportsProgress = True
    BackgroundWorker1.RunWorkerAsync()
    

    添加这些事件:

    Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim FileReaderName, FileReaderAge As System.IO.StreamReader
        FileReaderName = My.Computer.FileSystem.OpenTextFileReader(des & "\name.txt")
        FileReaderAge = My.Computer.FileSystem.OpenTextFileReader(des & "\age.txt")
    
        Dim nameReader, ageReader As String
    
        Do While FileReaderName.Peek() >= 0 And FileReaderAge.Peek() >= 0
            System.Threading.Thread.Sleep(1000) 'Change the value if you want faster or slower 
    
            nameReader = FileReaderName.ReadLine
            ageReader = FileReaderAge.ReadLine
    
            BackgroundWorker1.ReportProgress(100, nameReader)
            BackgroundWorker1.ReportProgress(50, ageReader)
        Loop
    
        FileReaderName.Close()
        FileReaderAge.Close()
    End Sub
    
    Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        If e.ProgressPercentage = 100 Then
            TextBox1.Text = e.UserState.ToString
        Else
            TextBox2.Text = e.UserState.ToString
        End If
    End Sub
    

    【讨论】:

    • 我尝试将两者结合起来,但我的问题是它会给我一些错误,例如“已经有一个打开的流式阅读器”或类似的东西:(
    • 嗨,我已经尝试过你的代码,但我不会显示每一行..它只会显示最后一个值..
    • @tris 如果您在TextBox1.Text = nameReader TextBox2.Text = ageReader 之后添加此代码TextBox1.Refresh() TextBox2.Refresh(),它将显示每一行。 但是文本框的变化太快了。
    • @tris 如果您想同时阅读每一行,并且在中间有一点延迟而不影响您的应用程序,您需要创建一个线程或后台工作程序并将消息发送到要在文本框中显示的文本的主线程。您无法访问不同线程中的文本框。关键字是同时。这是唯一的方法。
    • 我尝试在文本框之后进行刷新,但它仍然是相同的显示..
    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多