阳光石油网|石油技术交流|石油人论坛

 找回密码
 欢迎注册
查看: 2466|回复: 4

从帮一个网友写了一个石油应用小程序说起 ----LAS 2.0文件数据处理VB程序

[复制链接]
  • TA的每日心情
    慵懒
    2014-4-26 22:33
  • 签到天数: 96 天

    [LV.6]常住居民II

    发表于 2014-2-13 22:48:03 | 显示全部楼层 |阅读模式

    马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。

    您需要 登录 才可以下载或查看,没有账号?欢迎注册

    x
    从帮一个网友写了一个石油应用小程序说起
    ----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 数据格式分析


    帖子长度所限 就先略去了


    这所以要了解这么多,主要是要准确的识别文件中的每一个数据,然后选择需要的数据进行处理,最后还要把处理好的数据写入一个新文件中,而生成的这个新文件必须遵循一定的规则,才能被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"时
                ExitDo     '退出循环,对以后的数据行进行处理
            End If
        End If

    Loop

    Do While (txtstreamSource.AtEndOfStream = False)    '对于文件中存储曲线信息的每个数据行进行处理,知道文件结束

        strLineSource =txtstreamSource.ReadLine        '从源文件中读取一行数据
        str1 =strStandardization(strLineSource)       '标准化处理
        i = 0       '定义数组下标并初始化为 0
        For Each a InSplit(str1, vbTab)             '对于标准化后的数据行,以vbTab为分隔符分组
           arrayStringTemp(i) = Split(str1, vbTab)(i)      '存入数组arrayStringTemp()中
            i = i + 1
        Next
        quantityItem =i

        IfcheckPERM.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

        IfcheckSW.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

        IfcheckPOR.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 ToquantityItem     '得到处理后的数据行
            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,也不知道最后程序有没有帮到他的忙。


    今天就写到这里,下次再从软件开发的角度来说一说自己的一些小体会。

    评分

    参与人数 2阳光币 +30 收起 理由
    niehaifeng + 10 积极讨论,阳光奖励
    justbetoo + 20 精品资料,感谢楼主

    查看全部评分

    相关帖子

  • TA的每日心情
    慵懒
    2014-4-26 22:33
  • 签到天数: 96 天

    [LV.6]常住居民II

     楼主| 发表于 2014-2-13 22:50:30 | 显示全部楼层
    更详细的 为删改的可以去我的论坛空间群看
    http://www.sunpetro.cn/home.php? ... blog&id=8416663
  • TA的每日心情
    开心
    2016-10-11 07:57
  • 签到天数: 1014 天

    [LV.10]以坛为家III

    发表于 2014-2-13 23:42:14 | 显示全部楼层
    太长 先mark
  • TA的每日心情
    难过
    2018-3-31 21:31
  • 签到天数: 319 天

    [LV.8]以坛为家I

    发表于 2014-2-13 23:49:30 | 显示全部楼层
    支持一下吧
  • TA的每日心情

    2024-4-17 10:07
  • 签到天数: 812 天

    [LV.10]以坛为家III

    发表于 2014-2-15 23:37:27 | 显示全部楼层
    支持。
    您需要登录后才可以回帖 登录 | 欢迎注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|阳光石油网 ( 鲁ICP备2021003870号-1 )

    GMT+8, 2024-5-23 00:47 , Processed in 0.076181 second(s), 27 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表