vbs中使用 ADO 读取所有数据均在一行上的文本文件的代码

使用 ADO 读取所有数据均在一行上的文本文件问:
您好,脚本专家!我有一个固定宽度的文本文件,该文件包含名字(6 个字符)、姓氏(13 个字符)和部门(9 个字符),并且它们均在同一行上。我该如何使用 ADO 来读取呢?
-- DW
答:
您好,DW。坦白地讲,我们认为您不能使用 ADO(ActiveX 数据对象)读取这样的文件。ADO 是一种和文本文件进行交互的非常好的方法(有关详细信息,请参阅文章有关文本文件的 ADO 更多知识(英文)),但是,确实,ADO 有些挑剔:它的每项设置都必须完全正确,否则就会拒绝工作。(不像脚本专家,即使所有事情都已准备就绪,他们还是会拒绝工作。)作为一种数据库技术,ADO 需要一个“结构良好”(借用 XML 领域的一个术语)的数据库;它无法直接利用您那样的文件格式并从中产生数据库。(在这种情况下,可以将您的巨行分成若干单个记录。)
但是没关系;毕竟,我们可以使用虽古老但优秀而可靠的 VBScript 来创建结构良好的数据库。我们今天要做的就是向您展示如何快速而便捷地将您的巨大数据字符串分割成单个记录。只需通过将这些单个记录(即,文本文件中的单个记录)回显到屏幕上我们就可以达到目的。不过,您可以将这些记录段写到另一个文本文件然后使用 ADO 从其中读取数据。我们只是帮您开个头,剩下的就要靠您自己了。
首先,我们假定您已拥有一个类似于下面的文本文件,该文件的字段名称和两条记录包含于同一行之上:
First Last         Dept     Ken   Meyer        Finance  Pilar Ackerman     HR
我们希望最后的结果同下面的显示更为相似:
First Last         Dept     
Ken   Meyer        Finance  
Pilar Ackerman     HR
这可能吗?当然可能:


代码如下:

Const ForReading = 1 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading) 
strContents = objFile.ReadAll 
objFile.Close 
i = False 
Do Until i = True  
    intLength = Len(strContents) 
    If intLength < 28 Then 
        Exit Do 
    End If 
    strLines = strLines & Left(strContents, 28) & vbCrLf 
    strContents = Right(strContents, intLength - 28) 
Loop 
Wscript.Echo strLines

首先定义名为 ForReading 的常量并将其值设置为 1;我们将使用它打开要读入的文本文件。 
注意:您知道您的母亲为何一直告诉您要带上帽兜或者在穿过街道的时候朝两边看吗?是的,我们脚本专家也一直告诉您在没有指定要打开的文本文件的方式的情况下是无法将其打开的:是读取、写入还是添加。一次只能执行一项操作:无法同时以读取和写入方式打开文本文件。因此需要常量 ForReading。
噢,也戴上您的帽兜。外面很冷。
接下来我们创建 FileSystemObject 的实例并使用 OpenTextFile 方法打开文件 C:\Scripts\Test.txt。我们调用 ReadAll 方法以将此文件的全部内容读取到变量 strContents 中,然后使用 Close 方法关闭文件。
之后的这行代码很短并且有些古怪:
i = False
我们立即要做的就是建立 Do 循环,该循环用 28 个字符的增量来读取文件的内容(即变量 strContents 的值)。为什么是 28 个字符?因为,在每条记录中,我们使用 6 个字符保存名字、13 个字符保存姓氏和 9 个字符保存部门。因此:
6 + 13 + 9 = 28
为了保证循环始终进行直到整个文件读取结束,我们将变量 i 设为 False,然后执行循环直到 i 等于 True:
Do Until i = True
我们发现,i 永远不会等于 True,但是别着急:我们仍可以跳出此循环,稍后就会向您显示这种神奇的功能。
在循环内部,我们首先使用 Len 函数来确定字符串 strContents 中字符的数量(对于我们的示例文件,再加上作为一条记录的标题行,共 3 条记录,每条 28 个字符,即总共 84 个字符)。然后是以下这一小段代码:
If intLength < 28 Then
    Exit Do
End If
这里我们要做的就是检查字符串长度是否少于 28 个字符。如果是,则我们一定已经到达了文件的末尾。因此,我们使用 Exit Do 命令退出循环。(这就是非常了不起的脚本专家设法逃离永无休止的 Do 循环魔掌的方式!)
若长度为 28 个字符或更多,则执行下面这行代码:
strLines = strLines & Left(strContents, 28) & vbCrLf
此处我们创建一个新字符串 strLines,它将文本文件的内容分成几条单个记录,每条记录由 28 个字符及一个回车换行符 (vbCrLf) 组成。为此,我们只需将 strLine 的当前内容同字符串中的前 28 个字符(Left 函数执行的正是此操作)及 VBScript 的常量 vbCrLf 连接起来即可。第一次循环之后 strLines 结果如下:
First Last         Dept
明白其工作原理了吗? 
在第一行(也就是我们的第一条记录)被安全地放到变量 strLines 中之后,接着我们就要将该信息从 strContents 中删除。这就是下面的代码所要执行的操作:
strContents = Right(strContents, intLength - 28)
这次我们要使用 Right 函数从字符串末端取出 x 个字符,也就是逆向执行。那么我们所说的 x 个字符到底是什么意思?要得到 x 的值,我们需取到 strContents 的长度 (84) 然后减去 28(单个记录的长度)。得到的结果为 56 (84 - 28 = 56),因此我们从字符串的末端开始向回数 56 个字符。这表示第一次循环之后我们会得到下面这样的结果:
Ken   Meyer        Finance  Pilar Ackerman     HR
注意:是的,有其他的方法可以达到同样的目的,其中一些可能会节省一两行代码。不过,我们认为这种方法是最简单的。
正如您所见,我们所做的全部工作就是删除了第一条记录。现在准备返回循环,重复此过程。当然,这次 strContents 的长度为 56;因为我们刚刚去掉了 28 个字符。自然,这意味着我们要停止提取此数据并停止将其添加到变量 strLines 中: 
Ken   Meyer        Finance
我们继续此过程直到删除变量 strContents 中的所有字符。此时,我们只是回显 strLines 的值:
First Last         Dept     
Ken   Meyer        Finance  
Pilar Ackerman     HR
如果不是一个结构良好的数据库,那我们也不知道结果会是什么样子。
如果您希望能够将数据保存到一个文本文件并可以使用 ADO 读取此数据,就按我们讲过的去做;或者也可以只使用 VBScript 的字符串处理功能来将每行分成若干单个记录。我们将决定权留给了您。

(0)

相关推荐

  • vbs中使用 ADO 读取所有数据均在一行上的文本文件的代码

    使用 ADO 读取所有数据均在一行上的文本文件问: 您好,脚本专家!我有一个固定宽度的文本文件,该文件包含名字(6 个字符).姓氏(13 个字符)和部门(9 个字符),并且它们均在同一行上.我该如何使用 ADO 来读取呢? -- DW 答: 您好,DW.坦白地讲,我们认为您不能使用 ADO(ActiveX 数据对象)读取这样的文件.ADO 是一种和文本文件进行交互的非常好的方法(有关详细信息,请参阅文章有关文本文件的 ADO 更多知识(英文)),但是,确实,ADO 有些挑剔:它的每项设置都必须完

  • C++ 中实现把EXCEL的数据导入数据库(ACCESS、MSSQL等)实例代码

    C++ 中实现把EXCEL的数据导入数据库(ACCESS.MSSQL等)实例代码 在把EXCEL的数据导入数据库之前,先进行一些简单的准备工作: 1.把数据所在的EXCEL表另保存为DBF 4格式. 2.打开BCB,添加AdoTable(改名为DBFTable)和DataSource这两个控件 OK,准备工作,到此结束,剩下的就是打代码了 1.在Form_Load()事件中,加入以下代码: AnsiString filepath=ExtractFilePath(FileName); //File

  • PHP中使用xmlreader读取xml数据示例

    有一个XML文件,内容如下: 复制代码 代码如下: <?xml version="1.0"?>  <shows>      <show>          <name>Simpsons</name>          <channel>FOX</channel>          <start>8:00 PM</start>          <duration>30

  • python 使用openpyxl读取excel数据

    openpyxl介绍 ​ openpyxl是一个开源项目,它是一个用于读取/写入Excel 2010文档(如xlsx .xlsm .xltx .xltm文件 )的Python库,如果要处理更早格式的Excel文档(xls),需要用到其它库(如:xlrd.xlwt等),这是openpyxl比较其他模块的不足之处.openpyxl是一款比较综合的工具,不仅能够同时读取和修改Excel文档,而且可以对Excel文件内单元格进行详细设置,包括单元格样式等内容,甚至还支持图表插入.打印设置等内容. ​ p

  • PHP file_get_contents函数读取远程数据超时的解决方法

    在网络状况比较差的情况下file_get_contents函数经常读取远程数据失败. 解决办法如下: 复制代码 代码如下: /*设置超时配合失败之后尝试多次读取,效果比原先好很多*/ $url = 'http://www.jb51.net';           $opts = array(            'http'=>array(           'method'=>"GET",           'timeout'=>1, //设置超时   )  

  • 使用MSScriptControl 在 C# 中读取json数据的方法

    C#中已经有JavaScriptSerializer类可以将json数据给反序列化为对象 /// <summary> /// JSON文本转对象,泛型方法 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="jsonText">JSON文本</param> /// <returns>指定类型的对

  • C#实现读取DataSet数据并显示在ListView控件中的方法

    本文实例讲述了C#实现读取DataSet数据并显示在ListView控件中的方法.分享给大家供大家参考.具体如下: /*lvStudentList为ListView控件名 */ DataSet ds = new DataSet(); ds = student.QueryStudents(); //查询表的信息 int rowCount, columnCount,i,j; rowCount = ds.Tables[0].Rows.Count; columnCount = ds.Tables[0].

  • 浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片测试,有的时候,我们并不需要对很多图像做测试,可能就是几张甚至一张.这种情况下没有必要用队列机制. import tensorflow as tf import matplotlib.pyplot as plt def read_image(file_name): img = tf.read_fil

  • python pandas库读取excel/csv中指定行或列数据

    目录 引言 1.根据index查询 2.已知数据在第几行找到想要的数据 3.根据条件查询找到指定行数据 4.找出指定列 5.找出指定的行和指定的列 6.在规定范围内找出符合条件的数据 总结 引言 关键!!!!使用loc函数来查找. 话不多说,直接演示: 有以下名为try.xlsx表: 1.根据index查询 条件:首先导入的数据必须的有index 或者自己添加吧,方法简单,读取excel文件时直接加index_col 代码示例: import pandas as pd #导入pandas库 ex

  • asp.net实现Postgresql快速写入/读取大量数据实例

    最近因为一些项目需要大量插入数据,研究了下asp.net实现Postgresql快速写入/读取大量数据,所以留个笔记 环境及测试 使用.net驱动npgsql连接post数据库.配置:win10 x64, i5-4590, 16G DDR3, SSD 850EVO. postgresql 9.6.3,数据库与数据都安装在SSD上,默认配置,无扩展. CREATE TABLE public.mesh ( x integer NOT NULL, y integer NOT NULL, z integ

随机推荐