【问题标题】:How to delete the first and last lines from a text file in visual basic如何在Visual Basic中从文本文件中删除第一行和最后一行
【发布时间】:2010-01-20 06:44:56
【问题描述】:

我看过有关从文本文件中删除指定为函数参数的行的帖子,但我只需要从文件中删除第一行和最后一行。

在处理文件方面我仍然是新手,但删除第一行似乎应该很简单......只需删除从 BOF 到第一个 CrLf 字符的所有文本。我说的对吗?

至于最后一行,我知道我必须计算文本文件中的行数才能找到它(因为文件并不总是 x 行长)。这是我真正需要帮助的地方。

注意我正在使用 VB.NET 2005

【问题讨论】:

    标签: vb.net file-io


    【解决方案1】:

    将文件完全作为字符串读入行列表。使用索引循环将文件写回以捕获除第一个和最后一个项目之外的所有项目。

        Dim listText As New List(Of String)
        Dim objLine As String = ""
    
        Using objReader As StreamReader = New StreamReader("c:\test.txt")
            Do
                objLine = objReader.ReadLine()
                If objLine IsNot Nothing Then listText.Add(objLine)
            Loop Until objLine Is Nothing
        End Using
    
        Using objWriter As StreamWriter = New StreamWriter("c:\testOutput.txt")
            For I As Integer = 1 To listText.Count - 2
                objWriter.WriteLine(listText.Item(I))
            Next
        End Using
    

    编辑以满足非常挑剔的人:

        Dim arrText() As String
        Dim sLine As String = ""
    
        arrText = File.ReadAllLines("c:\test.txt")
    
        Using objWriter As StreamWriter = New StreamWriter("c:\testOutput.txt")
            For I As Integer = 1 To arrText.Length - 2
                objWriter.WriteLine(arrText(I))
            Next
        End Using
    

    【讨论】:

    • 您可能有兴趣了解System.IO.File 上的File.ReadAllLines 方法:)
    • @AakashM - 嗯,这真的是一个偏好问题。我更喜欢列表和集合而不是数组。 ReadAllLines 只产生一个字符串数组。更新了代码示例以包含两者。
    • 您不需要阅读所有行来完成此操作。在提出这种方法之前知道文件的大小不是谨慎的做法吗?
    • 为了删除第一行,您需要阅读整个文件。我看到您使用字节数组的情况。为了摆脱第一行,您仍然必须将整个文件读入一个新的字节数组。对于超大文件,这两种解决方案都很昂贵。要处理超大文件,您需要分阶段读取它们,并将它们写到相同阶段级别的单独文件中。
    【解决方案2】:

    这是删除最后一行,而不读取整个文件。您可能需要修改逻辑以说明 EOF 是换行符...

        Dim fs As New FileStream("c:\test.txt", FileMode.Open, FileAccess.ReadWrite)
        Dim b(1) As Byte
    
        Do
            fs.Seek(fs.Length - 2, SeekOrigin.Begin) 'seek 2 bytes from EOF
            fs.Read(b, 0, 2) 'read last two bytes
            'are they newline
            If System.Text.Encoding.ASCII.GetString(b, 0, 2) <> Environment.NewLine Then
                fs.SetLength(fs.Length - 1) 'set length to -1
            Else
                fs.SetLength(fs.Length - 2)
                Exit Do
            End If
        Loop
        fs.Close()
    

    【讨论】:

    • 所做的只是删除最后一个换行符。它不会删除第一行。据我所知,它只删除了最后一个字节。
    • 是的。我不应该认为他已经控制住了。
    • 大家好,感谢您的建议。我们可以认为这个案例已经结束,见下文:social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/…
    【解决方案3】:

    文件是流,没有捷径。您必须读取整个文件并将其写回,减去第一行和最后一行。当然,效率极低,请改用数据库。

    【讨论】:

    • Hmya,如果我们能忽略“删除第一行”的要求就好了。
    • 我会使用数据库,但执行此操作的代码将在一个进程中实现,该进程从该进程的文本文件的第一行和最后一行去除列标题和尾随空格然后将导入到数据库中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多