用vbscript实现从后到前阅读一个文本文件

问:
嗨,Scripting Guy!我有一个日志文件,新的数据总是被添加到文件的底部;也就是说最近的条目总是位于文件的末尾处。我想从最后一行开始读取内容,直到文件的第一行,但是我不知道怎样实现。

-- MB, Milwaukee, WI

答:
您好,MB.FileSystemObject 非常有用,但是它也具有它自己的一些限制;主要限制之一便是它只能从前向后读取文件内容。和 Tail 工具不同,您不能要求 FileSystemObject 从后向前读取文件。(好,我们假定您要求这么做,但是它肯定无法为您实现。)

但是,没有关系,正如使用脚本做其他事情一样,您总能找到一个办法冲破这种限制的束缚。在这种情况下,我们所做的就是继续向前,从前向后读取文件,从第一行还是,到最后一行结束。但是,和立即将这些行显示在屏幕上不同,我们将它们保存在一个数组里,文件中的每一行代表数组中的一个元素。

我们为什么要这样做?好,现在我们有了一个下面这样的数组,保存了文本文件中的信息:

violet
indigo
blue
green
yellow
orange
red

不可否认的是,我们现在所做的就像重新发明轮子一样。不过,文本文件和数组之间有一个重要的不同之处: 从后向前读取数组非常容易。我们将要脚本从数组中的最后一个项目开始(我们可以使用 Ubound 函数来确定)并且从后向前读取到数组的第一个项目(Lbound)。

在我们的示例数组中,有 7 个项目;最后一个项目(Ubound)是单词 red,第一个项目(Lbound)是单词 violet。数组中的第一个项目的下标为 0;所以 violet 的下标为 0,red 的下标为 6。我们的脚本将从项目 6 开始向前到项目 0 为止。那怎样实现呢?我们将参数 Step 设为 -1,也就表示,“找到项目 6 ,然后对它做点什么;然后将下标减 1,得到 5。在找到项目 5 ,再对它做点什么。重复这个过程,直到处理完了数组中的所有项目。”

具体的实现代码如下所示:

Dim arrFileLines()
i = 0
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\FSO\ScriptLog.txt", 1)
Do Until objFile.AtEndOfStream
     Redim Preserve arrFileLines(i)
     arrFileLines(i) = objFile.ReadLine
     i = i + 1
Loop
objFile.Close
For l = Ubound(arrFileLines) to LBound(arrFileLines) Step -1
    Wscript.Echo arrFileLines(l)
Next

如果您没有使用过数组,可能看起来有点糊涂,但是在熟悉了它之后,便会发现它实际上很简单。

好,我们从后向前读取文件的输出结果如下所示:

red orange yellow green blue indigo violet
有关数组使用的更多信息,请参阅Microsoft Windows 2000 脚本编写指南.

(0)

相关推荐

  • 用vbscript实现从后到前阅读一个文本文件

    问: 嗨,Scripting Guy!我有一个日志文件,新的数据总是被添加到文件的底部:也就是说最近的条目总是位于文件的末尾处.我想从最后一行开始读取内容,直到文件的第一行,但是我不知道怎样实现. -- MB, Milwaukee, WI 答: 您好,MB.FileSystemObject 非常有用,但是它也具有它自己的一些限制:主要限制之一便是它只能从前向后读取文件内容.和 Tail 工具不同,您不能要求 FileSystemObject 从后向前读取文件.(好,我们假定您要求这么做,但是它肯

  • PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号

    最近发现做一个php程序表单数据提交写入数据库的内容中只要是带有单引号或者双引号的内容时,后面都会增加一个反斜杠.而且每保存一次增加一个反斜杠,很是郁闷. 于是从网上搜了一下原来是PHP程序为了防止注入或者溢出,通过PHP 指令 magic_quotes_gpc自动在双引号.单引号.反斜杠.NULL前面添加反斜杠. 默认PHP 指令 magic_quotes_gpc是on的,也就是打开的.这时候就可以用stripslashes() 函数删除自动添加的反斜杠.用法就是:比如包含字符串的变量是$st

  • 浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑

    有一个这样的需求: 当商品设置为立即上架时,通过审核就进入上架状态,当设置为保存时,通过审核就进入未上架状态. 所以,需要在保存前根据提交的审核状态和设置的方式得到商品状态再保存,而通过$form->model()->attribute_name只能获取提交后的值,不能更改. Google之后发现了已经有解决方案:可以修改提交表单时的逻辑吗 #375 在模型中添加如下方法: public static function boot() { parent::boot(); static::savi

  • oracle数据排序后获取前几行数据的写法(rownum、fetch方式)

    目录 0. 前言 1. 先说结论 2. 举个例子 1. 数据准备 2. 使用rownum方式获取前几行数据 3. 使用fetch方式获取前几行数据(推荐) 总结 0. 前言 无论在工作中,还是学习中,都会出现这样子的需求,对某张表进行了排序(按时间排序也好,其他字段排序也罢),然后获取前x行的数据,由于工作中经常出现,因此写篇文章记录一下多种写法. 1. 先说结论 第一种使用rownum方式,在oracle数据库中,查询出来的数据,可以通过rownum(行数)来指定具体第几行数据,但需要注意以下

  • 解决py2exe打包后,总是多显示一个DOS黑色窗口的问题

    setup.py: #!/usr/bin/env python # coding=utf-8 from distutils.core import setup import py2exe setup( description = 'software', version = '0.0.1', console=[{"script": "main.py", "icon_resources": [(1, "icon.ico")]}],

  • 用vbscript实现在消息框中显示一个超链接

    问: 嗨,Scripting Guy!可以在消息框中包含指向某个 Web 页面的超链接吗? -- CB 答: 嗨,CB.听起来您好像想要向用户显示一个消息框,并且希望在消息框中包含一个超链接,以便用户可以点击这个链接,从而获得更多信息.例如,假设某个用户试图访问一些资源,但被拒绝了.这种情况下,您可以弹出一个消息框,告诉用户访问被拒绝,然后向他们提供一个链接,这个链接指向的页面会告诉用户访问所需的权限.一般说来,这种办法会比简单地说"访问被拒绝"好得多. 那么,是否可以用脚本编写语言实

  • webpack4 从零学习常用配置(小结)

    webpack 的核心价值就是前端源码的打包,即将前端源码中每一个文件(无论任何类型)都当做一个 pack ,然后分析依赖,将其最终打包出线上运行的代码.webpack 的四个核心部分 entry 规定入口文件,一个或者多个 output 规定输出文件的位置 loader 各个类型的转换工具 plugin 打包过程中各种自定义功能的插件 webpack 如今已经进入 v4.x 版本,v5.x 估计也会很快发布.不过看 v5 的变化相比于 v4 ,常用的配置没有变,这是一个好消息,说明基本稳定.

  • Java实现二叉搜索树的插入、删除功能

    二叉树的结构 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode(int val) { this.val = val; } } 中序遍历 中序遍历:从根节点开始遍历,遍历顺序是:左子树->当前节点->右子树,在中序遍历中,对每个节点来说: 只有当它的左子树都被遍历过了(或者没有左子树),它才会被遍历到.在遍历右子树之前,一定会先遍历当前节点. 中序遍历得到的第一个节点是没

  • asp.net core + jenkins 实现自动化发布功能

    目录 一.安装Jenkins 二.安装Gitee插件 三.服务器相关编译环境配置 四.新建自动构建任务 由于部署个人博客系统的服务器只有2G内存,每次利用jenkins编译,发布的时候jenkins老是挂,因此新买了一台轻量应用服务器,专门用于个人博客系统的持续发布任务,下面讲解如何利用jenkins实现系统的持续发布功能. 一.安装Jenkins 我这边服务器是Linux CentOS 7 ,使用SSH 登录云服务器后,输入以下命令安装jenkins. sudo wget -O /etc/yu

  • c#文本加密程序代码示例

    控件滚动方法: 复制代码 代码如下: //具体方法//Movegroup(string u, Panel p1, Panel p2)//Movegroup(方向<或>,被移走的控件,被移入的控件)//注意还要添加两个timer :Return,Next , Interval = 10        public void Movegroup(string u, Panel p1, Panel p2)        {            if (u == ">") 

随机推荐