由于所有示例,此帖子看起来比它更长。伪代码没问题,但我正在使用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>
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分):
# COMMENT BLOCK #
findME2 80/tcp
findME1 80/tcp
skipME1 80/tcp
skipME2 80/tcp
# COMMENT BLOCK #
findME2 80/tcp
findME1 80/tcp
skipME1 80/tcp
skipME2 80/tcp
# COMMENT BLOCK #
#
findME2 80/tcp
findME1 80/tcp
skipME1 80/tcp
skipME2 80/tcp
findME2 80/tcp
findME1 80/tcp
skipME1 80/tcp
skipME2 80/tcp
# COMMENT BLOCK #
答案 0 :(得分:1)
除非你正在处理非常大的文件,否则以一种将输入文件解析为数组(甚至可能是2D数组或对象数组)的方式编写程序可能更合适,对它进行排序在内存中使用QuickSort或ASP.NET(如果您有权访问),然后通过打印出已修改的集合内容来覆盖该文件。
通过这种方式,您不必担心跟踪文件指针等低级细节,其他好处:它会自动清理错误的格式,它会对任何现有条目进行排序没有正确排序,你可以稍后扩展它以进行其他类型的处理。