| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 942 人关注过本帖, 1 人收藏
标题:求助,对数据文件(TXT格式)深度处理
只看楼主 加入收藏
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
结帖率:70%
收藏(1)
已结贴  问题点数:20 回复次数:2 
求助,对数据文件(TXT格式)深度处理
首先,在这里深深感谢"风吹过b"版主大大的帮助,“数据处理-源码-针对格式-1文本”这段程序就是在他的帮助下完成的,使用起来非常完美,处理速度、方便程度都非常非常的令人满意,"风吹过b"版主大大编程水平令我拜服。

现在,又遇到两种数据格式,处理方式与“数据处理-源码-针对格式-1文本”这段程序一模一样。本想套用"风吹过b"版主大大的程序,对程序做些许修改,但是"风吹过b"版主大大的程序非常严谨,并且本人能力和水平有限,只要对程序做出一点点改动就运行报错,半个月了,无从下手。

恳请"风吹过b"版主大大、各位版主大大以及路过的高手,协助我在“数据处理-源码-针对格式-1文本”这段程序的基础上作出修改,使其可以处理格式-2、格式-3的两段数据,不必功能合并,一个软件针对一种格式就行。

拜谢大家了!


数据处理-源码-针对格式-1文本.rar (162.43 KB)

三种数据格式及图片说明.rar (325.39 KB)
搜索更多相关主题的帖子: 格式 处理 版主 数据 文本 
2017-10-25 15:27
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4937
专家分:30047
注 册:2008-10-15
收藏
得分:20 
格式2的文件解析函数。

程序代码:
Option Explicit

Public Const SiteStartStr = "Site 1:"
Public Const SiteEndStr = "Testflow ended after"

Public Const SiteBinstr1 = "Site 1 has PASSED. Binned to bin"
Public Const SiteBinstr2 = "Site 1 has FAILED. Binned to bin"

Public Enum PassFaiL
    PASS = 1
    FAIL = 2
End Enum

Public Enum 清显示范围
    全部 = 0
    分析 = 1
    删除 = 2
    修改 = 3
End Enum


Public Type SiteType
    Site          As String         'Site
    SiteNew       As String         'Site新值
    SiteS         As Long           '所处行数
    SiteBin         As Long         'PASS还是Fail内容
    SiteBinS        As Long         'PASS还是Fail所在行数
    PF              As PassFaiL     '这段是 pass 还是 Fail
End Type


Public Type FileTYpe
    
    '文件属性
    Name        As String
    Path        As String
    PathName    As String
    Size        As Long
    DateTime    As String
    ListCount   As Long

    data()          As String   '文件数据
    Datacount       As Long     '总行数
    
    '文件头内容
    FileT(2)        As String
'Level lot started on
'Level device started on

    '数据组数
    Count           As Long
    '数据
    Site()        As SiteType
    PassCount            As Long      '统计
    FailCount            As Long
End Type


Public PF As FileTYpe



Public Sub 文件解析()           '不传参数,填充全局变量 PF
'不负责备份文件

Dim i As Long, j As Long
Dim k As Long, tmp1 As String
Dim k1 As Long, k2 As Long

Dim fr As Long

fr = FreeFile

With PF

    .Datacount = 0
    .Count = 0
    .FailCount = 0
    .PassCount = 0

    .PathName = .Path & "\" & .Name               '文件名及全路径
    .DateTime = FileDateTime(.PathName)         '文件日期
    .Size = FileLen(.PathName)      '文件大小
    
    '预处理完成
    
    Call Form1.进度条(0.05, "准备打开文件..")
    
    Open .PathName For Input As #fr                   '打开文件
        tmp1 = Input(LOF(fr), #fr)                       '一次性读入内存
        
        Call Form1.进度条(0.1, "打开文件完成,准备分行")
        
        .data = Split(tmp1, vbCrLf)
        
        Call Form1.进度条(0.15, "分行完成,开始分析")
    Close #fr
    .Datacount = UBound(.data)
    
.Count = 0

    Call Form1.显示日志("正在分析步骤一..")
    
    '因为文件头比较简单,所以不放到循环里做,直接写二组重复的语句分析掉
    
'Level lot started on
    i = InStr(1, tmp1, "Level lot started on")
    If i > 0 Then
        j = InStr(i, tmp1, vbCrLf)
        i = i + Len("Level lot started on")
        .FileT(1) = Mid(tmp1, i, j - i)
    End If

'Level device started on
    i = InStr(1, tmp1, "Level device started on")
    If i > 0 Then
        j = InStr(i, tmp1, vbCrLf)
        i = i + Len("Level device started on")
        .FileT(2) = Mid(tmp1, i, j - i)
    End If

    
    tmp1 = ""                               '清掉内存
    
    
For j = 0 To .Datacount
    
    
    If InStr(1, .data(j), SiteStartStr) = 1 Then       'Device#:
        .Count = .Count + 1
    End If
   
Next j


    Call Form1.显示日志("正在分析步骤二..")

i = 0
ReDim .Site(.Count)
For j = 0 To .Datacount

    If j Mod 10 = 0 Then        '每处理10个变化一次进度条
        Call Form1.进度条(0.58 + j / .Datacount * 0.42)
    End If

    k = InStr(1, .data(j), SiteStartStr)
    If k = 1 Then       'Site#:
        i = i + 1
        .Site(i).SiteS = j              '开始行数
            .Site(i).Site = Trim(Mid(.data(j), k + Len(SiteStartStr)))          '编号
        .Site(i).SiteNew = .Site(i).Site    '新编号,为修改做准备
    End If
        
    k = 0   '因为K下面是从判断中来,所以每次都必须清掉
    k1 = InStr(1, .data(j), SiteBinstr1)        '按第一个条件测试
    k2 = InStr(1, .data(j), SiteBinstr2)        '按第二个条件测试
    
    If k1 = 1 Then k = k1       '如果有一个等于1 ,则找到
    If k2 = 1 Then k = k2
    
    If k = 1 Then
        
        
        .Site(i).SiteBinS = j           '所处行数
        '解析SiteBin
        .Site(i).SiteBin = Val(Mid(.data(j), k + Len(SiteBinstr1)))         '这二个字符串是等长,所以取长度时可以通用,否则需要拆分写
                
        '分析PF
        If .Site(i).SiteBin = 1 Then
            .Site(i).PF = PASS
            .PassCount = .PassCount + 1
        Else
            .Site(i).PF = FAIL
            .FailCount = .FailCount + 1
        End If
    End If

Next j

End With
    
    Call Form1.显示日志("文件解析完成")
    
End Sub

只是初步搞了一下,没去测试,保存之类的都没去弄,这个函数用掉了1个小时。
显示部分完全没去弄。

授人于鱼,不如授人于渔
早已停用QQ了
2017-10-26 09:36
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4937
专家分:30047
注 册:2008-10-15
收藏
得分:0 
写入文档又快30分钟。


-----格式3------
文件头处理,
原样保存着备用。如果你读了值,那么记得保存时,把文件头的项目名写进去。

每段分析流程

1、段头,根据关键字来查找,
如 格式3 的关键字就是:
Site1 PartID:
找到了 头,那么保存文件时,需要向前引用二行的数据进行保存。头之前有二个空行。


2、格式3里 编号写在二个地方,那么第二个地方也需要找出来。
这行正好在分析那一行里,一次性来分析。
先找出这行来 关键字:Device PartID: + " + 前面找到的编号。
找到后,这行里,查找到 Bin ,和 Site ,以及 SoftBin:  的位置
然后根据这2个值,截到1个字符,是 Bin 的值
然后 从SoftBin的位置向后取全部,直接转成数值,得到 SoftBin 的值。
根据这二个值,分析 Pass 或 FAil 。


这样每段需要的信息就分析出来了。


保存:
根据条件决定保存的内容

先写文件头,
然后再读每一节 起始行数 和 终止行数

格式3需要先写二个空行,
然后组合新的编号写入。再把从起始行数+1 到终止行数-1 之间的数据写入。
最后再组合终止行数,写入。
格式3的终止内容,编号:P+数字,数字总长5位,空格在后。其他原样写入。


--------格式2----------
文件头,只有二项,所以直接到总数据里查找,不使用循环去找,当然,用循环也行。

段头,同理处理
PASS 或 FAil 那行,有二种的开头,所以分二种情况分别查找。
其他处理差不多。
保存时,注意段头重新组合就没问题了。







授人于鱼,不如授人于渔
早已停用QQ了
2017-10-26 09:53
快速回复:求助,对数据文件(TXT格式)深度处理
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018382 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved