||
从帮一个网友写了一个石油应用小程序说起
----LAS 2.0文件数据处理VB程序
年前,在一个石油qq群(群名:地质人.生 群号:347465543,为群主传播一下 )里,看到一个网友(群昵称:地质--简单生活,下文称为Customer,简写作Ctmer)说,他为要处理200个测井数据文件(*.las)里的很多数据而头疼。他说了他的诉求是:
“ 我想把200井的曲线里SW、POR、perm小数表示的换算成100%的 如0.2--20这个样子的 这三组数据在LAS格式里不同的列里呢 。
1、自动打开一个LAS文件
2、找出por sw perm数据所在列 并判断是否是小数格式 如果是*100 如果不是 不操作
3、关掉修改完毕的文件,再打开下一个”
群里的网友热情的很,有的建议用petrel试一试,有的说写个VBA,有的说用discovery试一试,还有什么vlookup函数等等。
我也参与了讨论,说以前自己的毕设和一个同学写毕设都写了程序处理数据文件,我的用C#和fortran实现的,那个同学我是用VB实现的,不过处理的都是ASCII编码的文件。我问了Ctmer数据文件格式是什么编码,Ctmer只是说了是LAS 2.0文件。于是,我就手机上网(当时只有手机,电脑放到海洋平台了,没有带下来)查了下LAS 2.0文件格式,找到了一篇文章,介绍的如下:
“LAS格式是机载激光雷达测量系统(LIDAR)的标准数据格式。2009年7月14日,美国摄影测量与遥感(ASPRS)协会下的LIDAR委员会发布了LAS格式最新标准1.3版。现对1.3版与目前较为常用的1.0版进行了解析与比较,同时简要介绍了已发布的LAS2.0版,最后以VC++作为开发平台,应用内存映射与OpenGL技术实现对LAS文件中的点集数据进行快速读取显示,并通过试验验证了读取和显示效果。...”
我问Ctmer那个LAS2.0是不是上面说的,Ctmer说是。我就把这篇文章学完了(大家百度一下,应该还能搜到这篇文章),还随时做着笔记。后来我继续搜索las 2.0的文章,才发现Ctmer整错了,上面那个文章根本不是他所用到的las 2.0格式,害我白白学了一上午。后来发现Ctmer所说的LAS 2.0是下文所述的东东:
”LAS(Log ASCII Standard)是由加拿大测井协会制定的一种标准的测井数据格式。LAS 采用ASCII 编码,记录了主要的图头信息和测井数据。LAS 格式的目的是为个人电脑用户提供基本的数字测井数据,同时格式要求简单易于使用而且易于程序分析。...“
随着学习的深入以及上网搜索的加强,逐步加深了对LAS 2.0文件的了解。后来搜索到了一篇硕士论文--《测井数据格式解编框架设计及应用该框架实现LAS数据格式解编》,是吉林大学马勇光写的(他的入学导师英年早逝,后来又跟了一个导师。好了,不八卦了…),我就想让大学的同学帮我下载这个文献,碰巧ZB(不是2B哦,是名字拼音首字母缩写 Z B),当时还在学校,还没回宿舍,就让他在实验室帮我下载了这篇论文。我希望他可以帮我下载pdf格式的,这样我手机或者平板就可以看了,不过他说只有知网格式CAJ格式的,就先让他下了,想着到了平台上再用自己的电脑用知网软件看这篇论文。后来继续搜索的时候,在百度文库上搜到了一篇,喜出望外呀,这样自己就可以用手机查看了,不过很费流量倒是真的,打开关闭,关闭打开,还学了两三天,总之这个月我的流量超了很多哇。
马勇光同志写的真不赖,虽然这篇论文不是为我写的,不过我感觉就跟是为我写的一样的,我所需要的数据文件格式的信息,里面都包括了,甚至las 3.0的文件格式都有,不过由于Ctmer的文件是2.0的,我就没学3.0。下面从那篇论文的第四章内容摘抄如下:(想了解更多内容的话,就自己去百度一下或者让同学去知网下载一下去吧)
第四章LAS 数据格式分析
4.1 LAS 数据格式总体描述
LAS(Log ASCII Standard)是由加拿大测井协会制定的一种标准的测
井数据格式。LAS 采用ASCII 编码,记录了主要的图头信息和测井数据。
LAS 格式的目的是为个人电脑用户提供基本的数字测井数据,它的格式要
求简单易于使用而且易于程序分析。
目前存在多种数字测井数据格式。LIS(Log Information Standard)是
其中最为流行的格式之一。另一种更加完备的格式是由美国石油协会设计
的DLIS(Digital Log Interchange
Standard)格式。这两种格式都是被广泛
接受的格式,但这两种格式最初是针对磁带存储介质的;由于他们的完备
性,导致了复杂性,因而这两种格式并不能满足个人电脑用户的需求。与
其他格式相比,LAS 最明显的特点是采用ASCII 编码,所以不需要特别
的软件用户即可以使用,这点对于野外作业的操作人员来说更为方便和易
用。
LAS 目前最常用的是2.0 版本和3.0 版本。2.0 版本是1992 年制定的
标准,当时的个人电脑的性能有限,有着严格的存储空间限制,所以不能
保存磁带上的所有海量数据。LAS 2.0 用户最关心的一些信息,包括井信
息和各种测量曲线数据,可以将LAS 2.0 看作是LIS 和DLIS 的“用户的
摘要”版本。如果需要获得更多的测井信息,则需要使用这两种数据格式。
可以说,每种数据格式都有着各自特定的设计目的和出发点的。
LAS
2.0 获得了业界的认可,表明它确实满足了相当一部分用户的简
单易用需要。随着个人电脑硬件性能的飞速提升,磁盘存储介质存储容量
的指数级增长,当年的限制现在已经不再是问题。所以加拿大测井协会于2000 年基于原有的格式开发了LAS 3.0 格式。LAS 3.0 是LAS 2.0 的升级
版。LAS 3.0 在保留了LAS 2.0 优点的基础上,使LAS 文件可以存储更多
的数据和信息,同时可以处理更多的数据类型。LAS 3.0 依然遵循了2.0
中的设计原则,从格式上与2.0 有很多相似,并完全兼容2.0。
4.2 LAS 文件的组成
LAS 格式对于用户很容易理解和使用,同时提供了足够的标志来帮助
程序员分析LAS 文件。LAS 文件的扩展名一般以是“.las”或“.txt”,很
方便识别。对于早期的2.0 文件,每个文件只能放在一张磁盘上,如果文
件较大,需要额外的工作将文件分割放置在不同的磁盘上。
一个 LAS 文件由多个段(section)组成。每个段包含特定的信息或
数据。大多数段的顺序没有特别的要求,只有个别段的位置是特定的。如
第一个段必须为“version”段,该段包括了LAS 的版本信息和数据的存
储模式;LAS 2.0 中数据段必须作为最后一个段。
4.3 LAS 文件的标记
LAS 文件中包含了足够的标记来帮助标识格式及辅助程序解析。LAS
2.0 格式中包含如下标记:
“~”:当这个标志作为一行的第一个字符时,标识这一行的开始。2.0
中紧跟在这个字符后面的第一个字母表示这个段的类型,之后的所有字符
作为注释;3.0 中则是“~”后的第一个单词作为段的类型标记,之后的所
有字符作为注释。
“#”:这个标志作为一行的第一个字符时,表示该行为注释行。注释
行可以出现在数据段之前的文件任何位置。
“.”和“:”:在Version 段、Well 段、Curve 段和Parameter 段中使用
句点、空格和冒号分隔一行中的信息。在这些段中的每个非注释行必须包括一个句点和一个冒号。有关行的具体格式说明在下文将加以说明。
在 LAS 3.0 中又加入了下面几个用以分隔更多的信息。
“{}”:用来标识该行的数据格式。包括字符串、整数、浮点数、指
数、日期以及度。具体数据类型说明见下文。
“|”:用来关联行,可以将一行与该行有关的行关联起来,借用关联
可以实现2.0 中所不能表示的更多信息间的关系。
4.4 LAS 文件中的段的类型
段由两部分组成:段的第一行是以“~”起始的标题行,标识段的类
型;从第二行开始到下一个段的标题行以前,是该段的数据行,记录的该
段的内容。
4.4.1 LAS 2.0 中的段
在 LAS 2.0 文件中包含如下段的类型:
“~V”段:即Version 段,包含版本信息和
wrap 模式信息。
“~W”段:即Well 段,包含井的标识信息。
“~C”段:即Curve 段,包含曲线的定义信息。
“~P”段:即Parameter 段,包含参数或常量设置。这段是可选的。
“~O”段:即Other 段,包含其他的信息,例如注释。这段是可选的。
“~A”段:即ASCII 段,包含ASCII 编码的测井数据。
在 LAS 2.0 文件中的可选段不是必须出现的,也就是说一个LAS 2.0
文件至多有六个段,最少包含四个段。
4.4.2 LAS 3.0 中的段
在 LAS 3.0 文件中标识段是用“~”后的一个单词来标识的。即
“~Version”表示Version 段,“~Well”表示Well 段,“~Parameter”表示
Parameter
段或者称之为参数段,“~Curve”或“~Log_Definition”表示Curve
段或者称之为列定义段,“~ASCII”或“~Log_Data”表示ASCII 段或称之为列数据段。“~Curve”,“~ASCII”是2.0 中的术语;而“~Log_Definition”,
“~Log_Data”是3.0 中加入的表示方法。为了与2.0 兼容,3.0 同时支持
这两种表示方法。
在 LAS 3.0 中,将参数段,列定义段,列数据段三个段作为一组表示
一种记录类型, 共支持六种记录类型。如将“ ~Parameter ”,
“~Log_Definition”,“~Log_Data”三个段放在一起,记录测井信息和数
据(所以这也是3.0 中引入“~Log_Definition”和“~Log_Data”表示方法
的原因);“~Core_Parameter”,“~Core_Definition”,“~Core_Data”在一起
记录取心数据等。3.0 所支持的六种数据类型分别为“Log”测井数据,
“Core”取心数据,“Inclinometry”地层倾角数据,“Drilling”钻井数据,
“Tops”地面数据以及“Test”测试数据。
在 LAS 3.0 中,可以采用数组的方式表示一种数据类型的多组数据。
如果一个段和另一个段有同样的标题,每个标题都应该加入由“[]”跟随
的后缀, 在方括号中包含从“ 1 ” 开始的编号。如~Log_Data[1] |
Log_Definition,~Log_Data[2] | Log_Definition。这里注意一点,如果两个
列数据段共享同样的列定义段,则这两个列数据段所定义的曲线完全相
同。如果每个列数据段有自己的列定义段,则对列定义段也使用数组的表
示方法。如~Log_Data[1] | Log_Definition[1] , ~Log_Data[2] |
Log_Definition[2]。
在 LAS 3.0 中去除了Other 段,而使用格式化的用户自定义段取代之。
用户自定义段的定义与上面的记录类型的定义非常相似,也是以三段作为
一组, 三个段分别为“ ~User_Parameter ”,“ ~User_Definition ”,
“~User_Data|User_Definition”。其中的“User”可以替换为任意字符。段
内的格式与上面的三种段的定义完全相同,并且也可以使用段的数据的表
示方法。
4.5 LAS 文件的细节描述
由于 2.0 和3.0 相似之处很多,同时也存在不少的差异,所以在这一
节,将先对2.0 的格式细节加以阐述,然后对比2.0,说明3.0 的一些细节。
4.5.1 LAS 2.0 的细节描述
在 LAS 2.0 文件中,除了ASCII 段和Other 段以外的Version 段,Well
段,Parameter 段,Curve 段中的数据行都是如下格式:
MNEM.UNITS DATA :DESCRIPTION OF
MNEMONIC
其中,MNEN(Mnemonic)是该行所表示的项的名称。这个名称可
以是任意长度的字符串,但字符串中不能包含空格,句点或冒号。在字符
串之前或在字符串与句点之间可以有空格。
UNITS 是该项的单位。单位是可选的。如果使用单位,则单位必须直
接跟在句点的后面,单位和句点之间不能有空格。单位中不能包含空格或
冒号。
DATA 是该项的值。这部分是单位和冒号之间的所有内容,可以包含
空格或句点,但不能包含冒号。
DESCRIPTION 是该项的描述。可以为任意内容。
下面介绍一下各个段的内部表示和约束。
(1)Version 段。Version 段是每个LAS 文件中必须的,而且必须置
于文件的第一个段。它主要定义了LAS 文件的版本信息和是否使用wrap
模式。该段必须包含如下两行:
VERS. 2.0 : CWLS LOG ASCII STANDARD
- VERSION 2.0
WRAP. NO : One line per depth step 或
WRAP. YES : Multiple lines per depth
step
VERS 行记录了该LAS 文件所使用的LAS
版本。WRAP
行表示是否使用
wrap 模式。非wrap 模式是指在ASCII
段中每个深度的各曲线值记录在一行中,每行的长度(包括回车和换行字符)不超过256 个字符,用于曲线
较少的情况下;wrap 模式是指在ASCII 段中每个深度的各曲线值记录在
多行中,深度值独自占用一行,其他每行的长度(包括回车和换行)不超
过80 个字符。
在 Version 段中还可以记录其他信息。
(2)Well 段。Well 段也是每个LAS 文件必须的段。主要记录了起始
深度,终止深度,步长,井,位置等内容。该段必须包括如下行:
STRT.M
nnn.nn : START DEPTH 起始深度
STOP.M
nnn.nn : STOP DEPTH 终止深度
STEP.M
nnn.nn : STEP 步长
NULL.
nnnn.nn : NULL VALUE 空值
COMP.
aaaaaaaaaaaaaaaaaaaaa : COMPANY 公司名
WELL.
aaaaaaaaaaaaaaaaaaaaa : WELL 油井
FLD.
aaaaaaaaaaaaaaaaaaaaa : FIELD 油田
LOC.
aaaaaaaaaaaaaaaaaaaaa : LOCATION 位置
STAT.
aaaaaaaaaaaaaaaaaaaaa : STATE 州名
CTRY.
aaaaaaaaaaaaaaaaaaaaa : COUNTRY 国家名
SRVC.
aaaaaaaaaaaaaaaaaaaaa : SERVICE COMPANY 服务公司
DATE. aaaaaaaaaaaaaaaaaaaaa
: DATE 测井日期
UWI .
aaaaaaaaaaaaaaaaaaaaa : UNIQUE WELL ID 油井的唯一
编号
API .
aaaaaaaaaaaaaaaaaaaaa : API NUMBER API 值
除了上面这些必需的行以外,在 LAS 文件中还可以记录其他的行。
(3)Curve 段。该段是LAS 文件必需的段。记录了文件中的曲线定
义,包括曲线名称,单位和在数据段中的顺序。在该段中定义的曲线必须
和数据段中的数据列顺序一致。
(4)Parameter 段。该段是可选的。记录了测井过程中的各种参数
值。参数值可以是数字或者字符串。Parameter 段对具体的参数和参数的
数量没有规定,只需按行的格式记录即可。
(5)Other 段。该段是可选的。用于记录注释或备注。其内容就是
一个任意的字符串。
(6)ASCII 段。该段是LAS 文件必需的,而且必须作为文件的最后
一段。一列数据表示一条在Curve 段中定义的曲线,列之间用至少一个空
格分隔开,曲线的顺序与Curve 段中的定义顺序严格一致。深度列,即索
引列,必须作为数据的第一列。在wrap 模式中每个深度列单独一行。在
数据段中只支持浮点数[25]。
4.5.2 LAS 3.0 的细节描述
LAS
3.0 中的行的定义如下:
MNEM.UNIT
VALUE : DESCRIPTION {Format} | Assoc1,Assoc2 …
可以发现,3.0 与2.0 的行的定义非常类似,前四个域的意义与2.0
中也完全相同,只是加入了后面的两个域“{Format}”和“| Assoc1,
Assoc2 …”。
Format包含在最后的一个匹配的“{}”中,并且该部分是可选的。如
果没有指定Format,则这行的值部分只能为浮点数或字符串。Format共有
六种类型,分别是“{Fx.y}”浮点数,“{Ix}”整数,“{Sx}”字符串,
“{E0.00E+00}”指数,“{DD/MMM/YYYY hh:mm:ss}”日期和“{° ‘ "}”
以时分秒或小数表示的度数。
在LAS 3.0中,不止段支持数组表示,行同样也支持数组表示。这样
的结果是,3.0中不仅支持一维常规曲线,也可以支持更为复杂的二维数
据。比如,可以用如下的方式定义一个波形的阵列数据:
CHAN[1].Unit
: Description {AF10.4;0ms}
CHAN[2].Unit : Description {AF10.4;5ms}
CHAN[3].Unit : Description
{AF10.4;10ms}
CHAN[4].Unit : Description
{AF10.4;15ms}
CHAN[5].Unit : Description
{AF10.4;20ms}
“A”表示该行是数组行的其中一项,“F10.4”表示用“10.4”格式
化的浮点数,分号后面的“0ms”表示每个采样点的时间间隔。
“| Assoc1,Assoc2 …”也是可选的域,用来将不同的行关联起来。这
样便将独立的行组合在一起,可以表示更多的意义。很常用的一种用法是
表示参数深度分区。下面是参数段的一段例子:
NMAT_DEPTH[1].unit D1,D2 :
Neutron Matrix Depth interval
NMAT_DEPTH[2].unit D2,D3 :
Neutron Matrix Depth interval
MATR[1] . SAND : Neutron
Porosity Matrix | NMAT_DEPTH[1]
MATR[2] . LIME : Neutron
Porosity Matrix | NMAT_DEPTH[2]
前两行表示两个参数深度区间,后两行则表示MATR 参数在这两个
区间上的不同的值。
下面再介绍一下
LAS3.0 中的各段的内容定义。
Version 段。在3.0 中取消了wrap 模式,所以wrap 的值总是“no”。
又加入了“DLM”段,用来指示在数据段中用来分隔数据列的分隔符,
分隔符包括空格,逗号和TAB,而在2.0 中,数据段的分隔符只能是空格。
Well 段的定义内容和2.0 一致。
其他的段在
3.0 中的变化在前文的行的格式说明中都已做过介绍,这
里就不再重复说明了 [26]。
这所以要了解这么多,主要是要准确的识别文件中的每一个数据,然后选择需要的数据进行处理,最后还要把处理好的数据写入一个新文件中,而生成的这个新文件必须遵循一定的规则,才能被Ctmer所用,否则就白玩了。Ctmer给我发了一个井数据文件,格式如下:(文件名和数据做过处理了,一定要保护Ctmer秘密,这是职业道德呀)
文件名:MMMM123.LAS
~V
VERS. 2.00: Ver 2.00
~W
STRT.M 480.0000:
STOP.M 600.0000:
STEP.M 0.2500:
NULL. -999.2500:
UWI. MMMM123:
~C
DEPT.M :
R25.OHMM :
R05. :
SP.MV :
R045. :
R025. :
SH. :
PERM.MD :
SW.V/V :
RL3S. :
RL3D. :
CALI.IN :
POR.V/V :
DT.US/MT :
CALC. :
~A
480.0000 0.0000
5.2200 99.2700 9.0000
11.0400 83.7180 0.0100
100.0000 -999.2500 -999.2500
-999.2500 0.0010 -999.2500
0.0000
480.2500 0.0000
6.4400 99.8970 9.3080
12.0730 85.7020 0.0100
100.0000 -999.2500 -999.2500
-999.2500 0.0010 -999.2500
0.0000
480.5000 0.0000
7.2300 99.3480 9.0060
12.2900 85.6120 0.0100
100.0000 -999.2500 -999.2500
-999.2500 0.0010 -999.2500
0.0000
…
对数据文件格式学的差不多了,我就开始着手写代码了。由于C#语法忘得差不多了,就选择了VB语言来编写。写到一般的时候,感觉忘得VB语言也忘得差不多了,哎,自从12年7月份毕业后,就再没碰过程序的事,都给忘逑了。我记得我给我同学整过一个类似的VB程序,就让我那个同学把程序发给我,我又发给我一个学妹,让他用VB 6.0软件打开一下我的程序,让她把代码拷贝到一个txt文件里发给我,这样我才能手机来查看代码。不过她没有装vb 6.0,她找了办公室的装了vb 6.0的同学给我整,不过这个同学忘了vb 6.0怎么用的了,最后学妹找了另一个办公室的会使用vb 6.0的同学。不过,由于他们的电脑少一个专门用来画图的october控件(这个控件,一般的电脑都没有的,必须自己去下载才可以),不能打开我的程序,最后只能打开我的窗体文件,然后把代码复制出来到txt文件发给我。真谢谢我的学妹,小云呢。有了这个代码,我就写的很快了。
我原来那个程序,是自己手动选择一个文件夹,来选择数据,然后再选择一个文件夹,来存放数据。考虑到这个程序很简单,并且让Ctmer尽可能少的操作,就选择另一种方式来处理了。就是让Ctmer先建一个文件夹,然后再把我的.exe文件拷贝进去,然后在刚才那个文件夹里再建一个文件夹来放需要处理的数据文件,这样以后,直接双击.exe程序就可以了,在文件夹里就可以生成自己需要的文件了。
代码完成的差不多了(我用手写在笔记本上了,还把界面画了一下呢),我想找个人帮我用VB 6.0编译一下。不过,实在不好意思麻烦同学了,就等到15号上平台之后自己再整了。上了平台之后,利用晚上的时间,我用vb 6.0编译了一下,有几个错误,改过之后可以使用了。自己就简单设置了下界面,生成了一个exe文件。界面、代码和使用说明如下:
使用说明:
(1) 新建文件夹(名称自取,建议取名为“LogDataProcessFolder”),下文称为主文件夹
(2) 将本程序拷入主文件夹中
(3) 在主文件夹中,新建文件夹,名称为“SourceLogDataFolder”
(4) 将需要处理的数据文件,拷入“SourceLogDataFolder”文件夹中
(5) 双击本程序,“测井数据处理程序(JUST FOR 地质--简单生活 FROM 海油-pickle).exe”
(6) 选择需要处理的关键字(
"PERM.MD"、"SW.V/V"、"POR.V/V")
(7) 单击“开始”按钮,开始处理数据
(8) 已完成百分比显示为“100%”时,即为处理完毕,可单击“退出”按钮,退出程序
(9) 在主文件夹中,会生成文件夹“ProcessedLogDataFolder”,里面即为处理后的文件
群名片:海油-pickle
如有问题或有其他数据处理需要,请留言!
Vb代码(在vb 6.0可以编译通过):
Private Sub checkPERM_Click() '如果单击该选择框,判断是否选中,选择对应颜色
If checkPERM.Value = 1 Then '若选中,则红色
checkPERM.BackColor = vbRed
End If
If checkPERM.Value = 0 Then '若未被选中,则原色
checkPERM.BackColor = &H80FF80
End If
End Sub
Private Sub checkPOR_Click() '如果单击该选择框,判断是否选中,选择对应颜色
If checkPOR.Value = 1 Then '若选中,则红色
checkPOR.BackColor = vbRed
End If
If checkPOR.Value = 0 Then '若未被选中,则原色
checkPOR.BackColor = &H80FF80
End If
End Sub
Private Sub checkSW_Click() '如果单击该选择框,判断是否选中,选择对应颜色
If checkSW.Value = 1 Then '若选中,则红色
checkSW.BackColor = vbRed
End If
If checkSW.Value = 0 Then '若未被选中,则原色
checkSW.BackColor = &H80FF80
End If
End Sub
Private Sub cmdStart_Click()
Dim pathApplication As String '声明字符串变量 程序所在路径
Dim pathSourceLogDataFolder As String '声明字符串变量 源数据文件夹路径
Dim pathProcessedLogDataFolder As String '声明字符串变量 处理后数据文件夹路径
Dim quantityFile As Integer '声明整型变量 源数据文件的数量
Dim nameProcessingFile As String '声明字符串变量 正在处理的文件名
Dim numberProcessingFile As Integer '声明整型变量 正在处理的文件序号
Dim percentageTasked As Double '声明双精度型变量 已完成的百分比
Dim pathProcessingFile As String '声明字符串变量 正在处理的源文件路径
Dim pathProcessedFile As String '声明字符串变量 处理后的数据文件路径
Dim fsoTemp, folderTemp, collectionFileTemp, fileTemp,
txtstreamSource, txtstreamProcessed
'以上六个变量均为文件系统对象变量
Dim strLineSource As String '声明字符串变量 正在处理的文件的每行数据
Dim strLineProcessed As String '声明字符串变量 处理后的文件的每行数据
Dim strTemp As String, str1 As String '声明字符串变量 存储临时字符串
Dim arrayStringTemp(300) As String '声明字符串类型数组 每行数据拆分后的各项数据
Dim quantityItem As Integer '声明整型变量 数据行被拆分数组后,数组的大小
Dim PERM As Double
'声明双精度类型变量 渗透率
Dim SW As Double
'声明双精度类型变量 含水饱和度
Dim PORO As Double
'声明双精度类型变量 孔隙度
pathApplication = App.Path '获取程序所在路径
pathSourceLogDataFolder = pathApplication + "\"
+ "SourceLogDataFolder" '源数据文件夹路径
pathProcessedLogDataFolder = pathApplication +
"\" + "ProcessedLogDataFolder" '处理后的数据文件夹路径
Set fsoTemp =
CreateObject("Scripting.FileSystemObject")
If (fsoTemp.FolderExists(pathProcessedLogDataFolder) =
True) Then '判断是不是存在ProcessedLogDataFolder文件夹
fsoTemp.GetFolder(pathProcessedLogDataFolder).Delete
fsoTemp.CreateFolder (pathProcessedLogDataFolder) '若存在,先删除,后创建
Else
fsoTemp.CreateFolder (pathProcessedLogDataFolder) '若不存在,则创建之
End If
Set folderTemp =
fsoTemp.GetFolder(pathSourceLogDataFolder)
'获得源数据文件夹
Set collectionFileTemp = folderTemp.Files '获取源数据文件夹里的文件
quantityFile = folderTemp.Files.Count '获取源数据文件夹里的文件数量
textQuantityFile.Text = CStr(quantityFile) '将文件的数量显示在屏幕上
textQuantityFile.Refresh '刷新文本框
numberProcessingFile = 0 '定义并初始化正在处理的文件序号为0
For Each fileTemp In collectionFileTemp '对于每一个数据文件进行处理
textFileName.Text = fileTemp.Name '将正在处理的文件名显示在屏幕上
textFileName.Refresh '刷新文本框
numberProcessingFile = numberProcessingFile + 1 '每次处理一个文件,相应序号加 1
percentageTasked = CDbl(numberProcessingFile) /
CDbl(quantityFile) '计算已经完成的数据文件所占的百分比
textPercentageTasked.Text = Format(percentageTasked,
"0.00%") '格式化百分数,并输出到屏幕上
textPercentageTasked.Refresh '刷新文本框
pathProcessedFile = pathProcessedLogDataFolder +
"\" + fileTemp.Name '设定处理好的文件的路径
fsoTemp.CreateTextFile pathProcessedFile, True, True '创建一个文件,存放处理好的数据
Set txtstreamSource =
fileTemp.OpenAsTextStream(ForReading)
'以读取的方式,打开一个源数据文件
Set txtstreamProcessed =
fsoTemp.GetFile(pathProcessedFile).OpenAsTextStream(ForWriting)
'以写入的方式,打开存放处理好的数据的文件
Do While (txtstreamSource.AtEndOfStream = False) '对于文件中的每行数据进行处理,直到文件结尾则结束
strLineSource =
txtstreamSource.ReadLine '从源数据文件读入一行数据
txtstreamProcessed.WriteLine (strLineSource) '将源文件中读取的数据写入新建的文件中
str1 =
strStandardization(strLineSource)
'把从源文件中读取的数据行进行标准化处理
If (Len(str1)
> 0) Then '如果该行不是空行
str2 =
Split(str1, vbTab)(0) '把标准化后的数据行,以vbTab制表符为分隔符分组,并取第一项数据
If
(StrComp(str2, "~A") = 0) Then
'如果数据行的第一项为标示符"~A"时
Exit
Do '退出循环,对以后的数据行进行处理
End If
End If
Loop
Do While (txtstreamSource.AtEndOfStream = False) '对于文件中存储曲线信息的每个数据行进行处理,知道文件结束
strLineSource =
txtstreamSource.ReadLine '从源文件中读取一行数据
str1 =
strStandardization(strLineSource)
'标准化处理
i = 0 '定义数组下标并初始化为 0
For Each a In
Split(str1, vbTab) '对于标准化后的数据行,以vbTab为分隔符分组
arrayStringTemp(i) = Split(str1, vbTab)(i) '存入数组arrayStringTemp()中
i = i + 1
Next
quantityItem =
i
If
checkPERM.Value = 1 Then '如果该关键字被选中
If
(StrComp(arrayStringTemp(7), "-999.2500") <> 0) Then '如果为空值(即 -999.2500),则跳过,否则进行转换
arrayStringTemp(7) = Format(CDbl(arrayStringTemp(7)) * 100,
"0.0000")
End If
End If
If
checkSW.Value = 1 Then '如果该关键字被选中
If
(StrComp(arrayStringTemp(8), "-999.2500") <> 0) Then '如果为空值(即 -999.2500),则跳过,否则进行转换
arrayStringTemp(8) = Format(CDbl(arrayStringTemp(8)) * 100,
"0.0000")
End If
End If
If
checkPOR.Value = 1 Then '如果该关键字被选中
If
(StrComp(arrayStringTemp(12), "-999.2500") <> 0) Then '如果为空值(即 -999.2500),则跳过,否则进行转换
arrayStringTemp(12) = Format(CDbl(arrayStringTemp(12)) * 100,
"0.0000")
End If
End If
str1 =
""
For i = 0 To
quantityItem '得到处理后的数据行
str1 = str1
+ " " + arrayStringTemp(i)
Next
txtstreamProcessed.WriteLine (str1)
'将处理后的数据行写入文件中
Loop
Next
cmdQuit.SetFocus
'“退出”按钮获得焦点
End Sub
Private Sub cmdQuit_Click() '退出软件
End
End Sub
Function strStandardization(str As String) As String '将数据行进行标准化处理函数
'功能:将原来的数据行处理为标准的格式,即行首和行尾均无空格,切行中每项数据以一个制表符vbTab隔开
Dim i0 As Integer
Dim str1 As String
Dim str2 As String
str1 = ""
str2 = ""
str = Trim(str)
str = trimTab(str)
For i0 = 0 To Len(str) - 1
str1 = Mid(str,
i0 + 1, 1)
If
(StrComp(str1, " ") = 0) Then
str1 =
vbTab
End If
str2 = str2 +
str1
Next
str2 = trimTab(str2)
strStandardization = Trim(str2)
End Function
Function trimTab(ByVal sTxt As String) As String '将数据行的多个制表符合并的函数
'功能:将行中连续存在的多个制表符合并,只留一个
Do While InStr(sTxt, CStr(vbTab + vbTab)) <> 0
sTxt =
Replace(sTxt, CStr(vbTab + vbTab), CStr(vbTab))
Loop
trimTab = sTxt
End Function
Private Sub Form_Load()
Dim pathApplication As String '声明字符串变量 程序所在路径
Dim pathSourceLogDataFolder As String '声明字符串变量 源数据文件夹路径
Dim pathProcessedLogDataFolder As String '声明字符串变量 处理后数据文件夹路径
Dim fsoTemp
Dim str As String
pathApplication = App.Path '获取程序所在路径
pathSourceLogDataFolder = pathApplication + "\"
+ "SourceLogDataFolder" '源数据文件夹路径
Set fsoTemp =
CreateObject("Scripting.FileSystemObject")
If (fsoTemp.FolderExists(pathSourceLogDataFolder) =
False) Then '判断是不是存在SourceLogDataFolder文件夹
str = "请严格按照程序使用说明操作,否则“开始”按钮不可用!"
MsgBox str,
vbOKOnly, "温馨提示"
cmdStart.Enabled = False '若不存在该文件夹,则说明尚未完成准备工作,开始按钮不可用,否则,则可用
Else
str = "准备就绪!"
MsgBox str,
vbOKOnly, "温馨提示"
cmdStart.Enabled = True
End If
End Sub
这样什么都完成了,我就去给Ctmer留言,不过他一直不在线,只能找到我们上面那个群的群主地质—浅痕。痕是个大好人,她就帮我接收了exe程序,然后传给Ctmer了。我稍后把代码传到群共享了。由于联系不到Ctmer,也不知道最后程序有没有帮到他的忙。
今天就写到这里,下次再从软件开发的角度来说一说自己的一些小体会。
|Archiver|手机版|小黑屋|阳光石油网 ( 鲁ICP备2021003870号-1 )
GMT+8, 2024-12-23 09:56 , Processed in 0.033201 second(s), 18 queries .