遍历和索引文本文件

时间:2014-08-14 01:20:00

标签: string algorithm vbscript pseudocode

由于所有示例,此帖子看起来比它更长。伪代码没问题,但我正在使用vbscript。在克服了许多其他障碍之后,我留下了这个最后的难题,到目前为止还没有找到解决方案。

- 底线 -

我正在尝试提出一种强大的算法,用于在文本文件中识别理想的“插入点”(基于几个标准),以便在该点插入另一个文本块,并且将其余文本向下移动。我的最终目标是在文件中的特定位置插入一些必要的服务条目,以便于阅读和维护。

作为参考,我正在使用Windows中的“services”文件并位于以下位置:

C:\Windows\system32\drivers\etc\services

此文件可能如下所示:

 #
# <service name>  <port number>/<protocol>  [aliases...]   [#<comment>]
#
findME2     80/tcp
findME1     80/tcp
skipME1     80/tcp
skipME2     80/tcp

理想情况下,此算法不应因空行(任何地方),注释前的空格等变化而中断。


到目前为止,我编写了代码来读取“services”文件和我的模板文件(包含要添加的条目)到两个字符串变量中,我解析它们以创建相同“类型”的所有组合条目的列表,“然后消除重复,排序,最后创建一个类似于服务文件格式的新文本字符串。

现在我只需要在一些相关服务的第一个条目上方插入该文本块。例如:

合并参赛作品

findME1     80/tcp
findME2     80/tcp
NEWME1      80/tcp    #New Entry

插入点

# COMMENT BLOCK #
<-- INSERT HERE -->
skipME1     80/tcp
skipME2     80/tcp

RESULT

# COMMENT BLOCK #
findME1     80/tcp
findME2     80/tcp
NEWME1      80/tcp    #New Entry
skipME1     80/tcp
skipME2     80/tcp

请注意我开始使用的文件与上面的最终结果相比较。我的麻烦是,在迭代文件文本字符串中的每一行(在我的情况下使用For Each循环)时,我很难设置上面<-- INSERT HERE -->备注所示位置的索引。 / p>


问题

  1. 如何在所述位置识别索引?
  2. 是否有可能只迭代一次这个文本,或者我是否应该关注它? (我觉得我看到的循环太多了,但考虑到问题的本质,也许我不值得花时间去尝试优化它,是吗?)

  3. 样本算法

    Dim lines, index, indexLastComment, insertionIndex
    index = 0
    insertionIndex = -1
    indexLastComment = -1
    lines = Split(fileText, vbCrLf) 'fileText is from the "services" file
    For Each line In lines
        line = Trim(line)
        If Len(line) > 0 Then 'ignore empty lines           
            'Identify ideal line to insert new "services" entries
            If (Left(line,1) = "#") Then 'If a comment
                indexLastComment = index
            ElseIf ((insertionIndex = -1) _
                And (index > indexLastComment) _
                And (Left(line,4) = "find")) Then 'If insertionIndex not set
                'This should set the insertionIndex at the location of the first line
                '  beginning with "find" so long as the index of that line is after
                '  the last comment.
                insertionIndex = index
            End If
        End If
        index = index + 1
    Next
    

    预期的insertionIndex个样本(当然是0分):


    insertionIndex = 1

    # COMMENT BLOCK #
    findME2     80/tcp
    findME1     80/tcp
    skipME1     80/tcp
    skipME2     80/tcp
    

    insertionIndex = 2

    # COMMENT BLOCK #
    
    findME2     80/tcp
    findME1     80/tcp
    skipME1     80/tcp
    skipME2     80/tcp
    

    insertionIndex = 3

    # COMMENT BLOCK #
    
    #
    findME2     80/tcp
    findME1     80/tcp
    skipME1     80/tcp
    skipME2     80/tcp
    

    insertionIndex = 0

    findME2     80/tcp
    findME1     80/tcp
    skipME1     80/tcp
    skipME2     80/tcp
    
    # COMMENT BLOCK #
    

1 个答案:

答案 0 :(得分:1)

除非你正在处理非常大的文件,否则以一种将输入文件解析为数组(甚至可能是2D数组或对象数组)的方式编写程序可能更合适,对它进行排序在内存中使用QuickSort或ASP.NET(如果您有权访问),然后通过打印出已修改的集合内容来覆盖该文件。

通过这种方式,您不必担心跟踪文件指针等低级细节,其他好处:它会自动清理错误的格式,它会对任何现有条目进行排序没有正确排序,你可以稍后扩展它以进行其他类型的处理。