您好,BE。知道吗,要问关于数字方面的问题,您算是来对地方了。毕竟,有一个脚本专家拥有值得夸耀的高等数学学位。至于其他脚本专家么 … 别管其他脚本专家了。有一个脚本专家拥有值得夸耀的高等数学学位这件事我们以前提到过吗?
幸好,解决这个问题并不需要高等数学学位。(而且幸好我们也不需要,否则今天这个专栏可能真要狼狈不堪了。)BE,您说您有几个列有如下纬度和经度项的文本文件:
36000000
-076000000
92000000
105000000
您要打开文本文件,重新设置数字格式,然后保存重新设置格式后的文本文件。所有工作完成之后,您希望您的文本文件像这样:
36.000000
-76.000000
92.000000
105.000000
这能通过脚本实现吗?简直易如反掌:
Const ForReading = 1
Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:/scripts/test.txt", ForReading)
Do Until objFile.AtEndOfStream
intLine = objFile.Readline
intLine = intLine/ 1000000
intLine = FormatNumber(intLine, 6)
strText = strText & intLine & vbCrLf
Loop
objFile.Close
Set objFile = objFSO.OpenTextFile("c:/scripts/test.txt", ForWriting)
objFile.Write strText
objFile.Close
不必担心:我们会将个中原理悉数道来。毕竟,这是我们份内的事情,对吧?
如您所见,脚本开头就相当简单。我们首先定义一对常量 ForReading 和 ForWriting,将来处理文本文件本身时会用到它们。再创建一个 FileSystemObject 实例,然后使用 OpenTextFile 方法打开文件 C:/Scripts/Test.txt 进行读取。(您或许清楚,可以打开文本文件进行读取或写入,但这两种操作不能同时进行。)
接下来是下面这段代码:
Do Until objFile.AtEndOfStream
intLine = objFile.Readline
intLine = intLine/ 1000000
intLine = FormatNumber(intLine, 6)
strText = strText & intLine & vbCrLf
Loop
所有的亮点都在这儿。首先,我们设置 Do Until 循环来逐行读取文件,读取循环会持续到文件的最后一行(即,当 AtEndOfStream 属性为 True 时)。在该循环内,我们使用 ReadLine 方法来读取文件的第一行并将其值(在本示例文件中为 36000000)存储在名为 intLine 的变量中。
下一步就容易了。我们要取出数字 36000000 并将其转换为 36.000000。如何实现呢?为了便于初学者理解,我们将该值除以 1000000:
intLine = intLine/ 1000000
本例中,我们会得到值 36。要将其显示为小数点后带有 6 位数字的值,只需要调用 FormatNumber 函数:
intLine = FormatNumber(intLine, 6)
在此,我们所做的是将新值分配给变量 intLine。这个新值将会是什么呢?嗯,其实就是通过 FormatNumber 函数运行现有 intLine (36) 值后所得到的结果(即要求 FormatNumber 以 6 个小数位来显示该结果)。(这就是参数 6 的用途:它表示要显示的小数位数。)结果,36000000 转换为 36 后,现在 36 又转换为 36.000000。这正是我们从一开始就打算做的。
将文本文件中的第一行(第一个数字)进行转换后,接下来我们将新值和回车换行符 (vbCrLf) 添加到名为 strText 的变量中:
strText = strText & intLine & vbCrLf
您可能已经知道了,strText 只是一个变量,用于跟踪重新设置过格式的数字。当我们读取了文本文件中的所有行后,strText 的值就像这样:
36.000000
-76.000000
92.000000
105.000000
如果您在想“看,这个文本文件的数字格式似乎正如所愿”,那就自我表扬一下吧:这个文本文件的数字格式的确正如所愿。
因此,只要将 strText 的值保存到文本文件中,就万事大吉了。为此,我们首先要关闭文件 C:/Scripts/Test.txt。为什么呢?别忘了,我们已经打开了文件进行数据读取;要向文件中写入信息,必须先关闭文件,然后再重新打开文件。这就是我们现在要做的:
objFile.Close
Set objFile = objFSO.OpenTextFile("c:/scripts/test.txt", ForWriting)
我们使用 Write 方法将 strText 的值写入文本文件,最后关闭文件。最终的结果是:我们的文本文件就像这样:
36.000000
-76.000000
92.000000
105.000000
对于一帮数学能力有限的脚本专家来说这还算不错,是吧?
|
注意:尽管我们经常会自嘲,但还是应当告诉你,一个脚本专家没用计算器就把整个所得税申报表填完了。当然,处理很小的数字(例如他的薪水)时,确实并不需要计算器,但是,我们依然认为这还是很了不起。(编者注:在 IRS 决定对我们所有人进行审计之前,我们会为他们免去这一麻烦,告诉大家那个人就是 Greg。) |