如何在一定天数后删除.txt文件的各个部分?

时间:2017-07-12 20:36:31

标签: .net vb.net

我正在创建一个每天运行几次的应用程序。下面的代码是一个小部分,它开始将文本记录到.txt文件中。

Sub Main()


    Dim logFile As String
    Dim logFolderPath As String


    logFile = "C:\Users\myname\Desktop\testfolder\test.txt" 
    logFolderPath = System.IO.Path.GetDirectoryName(logFile) 'log Folder's path

    'creates folder to allow logging if path does not exist 
    If System.IO.Directory.Exists(logFolderPath) = False Then
        System.IO.Directory.CreateDirectory(logFolderPath)
    End If


    Dim todaysdate As String = String.Format("{0:MM/dd/yyyy hh:mm tt}", DateTime.Now)
    Dim file As System.IO.StreamWriter
    file = My.Computer.FileSystem.OpenTextFileWriter("C:\Users\myname\Desktop\testfolder\test.txt", True)
    file.WriteLine("----------Initiation----------")



 'more code below doing stuff and logging errors

程序运行几次后,.txt采用以下格式:

enter image description here

如果文本文件的天数为x天,我该如何删除它们的某些部分?或者至少,删除顶部的部分?

我找到了几个帖子,但删除了整个.txt文件,但没有删除其内容

编辑:图片中的日期都是一样的,因为我只是为了展示它的样子而多次运行程序。重点是日期不同。

2 个答案:

答案 0 :(得分:0)

如果不读取行本身,您无法知道文件中的哪一行是截断的正确位置,因此您必须逐行读取这些行以检查其日期时间值。有很多关于截断的帖子,你可以参考this。或者,您可以创建一个附加的文本文件(如数据库中的索引),该文件包含键值对,例如日期行索引值。然后,您可以在不读取内容的情况下指向文件内容中的正确位置。然而;这会增加文件处理的复杂性,因此除非对您的要求至关重要,否则应避免使用此替代方案。

答案 1 :(得分:0)

如果您的文件不会变得太大,您可以定义要使用的唯一标记来确定每个块的开头。

对于您的示例,您可以使用----------END----------

获得该令牌后,您可以将文件内容拆分为数组。

在每个数组元素中,您必须确定该元素的日期。既然您知道----------END----------将是您的标记分隔符,我们可以使用每个块中的最后一行来读取日期。

因为我们知道最后一个块的格式为`[space] m / d / y [space] h:m:s:z'我们可以通过使用空格字符拆分行来读取块的日期然后使用该日期中倒数第二个元素作为我们的数组。

您可以使用几行代码完成此操作:

Dim fileText = fileContent.Trim
Dim token As String = "----------END----------" '- -vbNewLine & vbNewLine
Dim output = (String.Join(token, (From block In Split(fileText, token).Where(
             Function(b)
                 Dim blockLines() = Split(b.Trim, vbLf)
                 If blockLines.Length > 2 Then
                     Dim parts = Split(blockLines.Last(), " ")
                     Dim dt As Date = parts(parts.Length - 2)
                     Return Now.Subtract(dt).Days < 7
                 End If

             End Function).ToArray())) & token).Trim()

File.WriteAllText("Output.txt", output)

当然,您需要添加错误处理和其他检查。

以下是模拟输入的完整代码:

Public Sub TruncFile()
    ' mock the content
    Dim fileContent As String =
<text>'-----------Initiation----------
blah blur blah blur 7/1/2017 2:23:pm
blah blur blah blur 7/1/2017 2:23:pm
blah blur blah blur 7/1/2017 2:23:pm
blah blur blah blur 7/1/2017 2:23:pm
blah blur blah blur 7/1/2017 2:23:pm
blah blur blah blur 7/1/2017 2:23:pm
----------END----------

----------Initiation----------
blah blur blah blur 7/2/2017 2:23:pm
blah blur blah blur 7/2/2017 2:23:pm
blah blur blah blur 7/2/2017 2:23:pm
blah blur blah blur 7/2/2017 2:23:pm
blah blur blah blur 7/2/2017 2:23:pm
blah blur blah blur 7/2/2017 2:23:pm
----------END----------

----------Initiation----------
blah blur blah blur 7/3/2017 2:23:pm
blah blur blah blur 7/3/2017 2:23:pm
blah blur blah blur 7/3/2017 2:23:pm
blah blur blah blur 7/3/2017 2:23:pm
blah blur blah blur 7/3/2017 2:23:pm
blah blur blah blur 7/3/2017 2:23:pm
----------END----------

----------Initiation----------'
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
----------END----------

----------Initiation----------
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
----------END----------
'
<text>.Value
    Dim fileText = fileContent.Trim
    Dim token As String = "----------END----------" '- -vbNewLine & vbNewLine
    Dim output = (String.Join(token, (From block In Split(fileText, token).Where(
                 Function(b)
                     Dim blockLines() = Split(b.Trim, vbLf)
                     If blockLines.Length > 2 Then
                         Dim parts = Split(blockLines.Last(), " ")
                         Dim dt As Date = parts(parts.Length - 2)
                         Return Now.Subtract(dt).Days < 7
                     End If

                 End Function).ToArray())) & token).Trim()

    Console.WriteLine(output)

End Sub

结果:

----------Initiation----------'
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
blah blur blah blur 7/10/2017 2:23:pm
----------END----------

----------Initiation----------
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
blah blur blah blur 7/11/2017 2:23:pm
----------END----------

如果你的文件很大,那么你必须逐个处理行并保持缓冲区和状态以跟踪文件中的位置并逐步将缓冲区写入新文件然后清除它