| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 479 人关注过本帖
标题:特定字符间循环取字符串处理
只看楼主 加入收藏
knight828
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-10-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
特定字符间循环取字符串处理
sn.rar (768 Bytes)
我一文本文件,导入数组,属特定字符间循环取字符串处理问题,如附件所示,代码如下:
程序代码:
Open ypdialog.FileName For Binary As #1
s = Space(LOF(1))
Get #1, , s
  s = Replace(s, Chr$(10), Chr$(13))
      Do Until InStr(1, s, Chr$(13) & Chr$(13), 0) = 0   
        s = Replace(s, Chr$(13) & Chr$(13), Chr$(13))      
      Loop
        ss = Split(s, Chr$(13))
For i = 0 To UBound(ss)
'///////////////////////////////////////////////////////////00AA
   If InStr(1, ss(i), "LOCATION  :  00AA") <> 0 Then
        n1 = i + 1     
        ordertxt.Text = ordertxt.Text & n1 & vbCrLf      
        If n1 <> 0 Then
            For j = n1 To UBound(ss)             
                    HAND.Add Mid(ss(j), 1, 8)  
                    COM.Add Trim(Mid(ss(j), 9, 15))                     
                    If InStr(1, ss(j), "              |          | BONDED | REQUEST | STKROOM | ASSIGN | MAKER |") <> 0 Then                     
                    Exit For                 
                   End If     
            Next j                  
        End If 
    End If     
    If InStr(1, ss(i), "LOCATION  :  00BB") <> 0 Then
        n2 = i + 1
        If n2 <> 0 Then
            For j = n2 To UBound(ss)           
                    HAND.Add Mid(ss(j), 1, 8) 
                    COM.Add Trim(Mid(ss(j), 9, 15))                     
                    If InStr(1, ss(j), "              |          | BONDED | REQUEST | STKROOM | ASSIGN | MAKER |") <> 0 Then                    
                    Exit For                 
                    End If   
            Next j                       
        End If
    End If 
  If InStr(1, ss(i), "LOCATION  :  00CC") <> 0 Then
        n3 = i + 1     
        If n3 <> 0 Then 
            For j = n3 To UBound(ss)              
                    HAND.Add Mid(ss(j), 1, 8) 
                    COM.Add Trim(Mid(ss(j), 9, 15))       
                    If InStr(1, ss(j), "              |          | BONDED | REQUEST | STKROOM | ASSIGN | MAKER |") <> 0 Then                      
                    Exit For                
                    End If     
            Next j                 
        End If
    End If 

 Next i
Close #1


'但不知道哪里问题,第一个特定字符串间的内容被循环了两次?
大家帮忙看看,如何改!
谢谢!

搜索更多相关主题的帖子: 字符串 
2014-11-22 12:34
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
没办法,你文本文件sn.txt里的“LOCATION  :  00AA”有两个。
我觉得你不过是想把特定格式的文本读入到集合hand、com中,完全可以简化代码达到相同效果的,总代码应该只需你的1/3即可完成。
2014-11-22 14:06
knight828
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-10-6
收藏
得分:0 
回复 2 楼 xzlxzlxzl
这是我为调试的新做的代码,双for,故而被load两次!
2014-11-22 17:07
knight828
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-10-6
收藏
得分:0 
集合也不止这两个,“LOCATION  :  00AA”里的00AA相当于一个集合的标识,做成一个集合放在数组第一列,以标识数据归类。
有没有办法,一次性跳出双for?
tks!
2014-11-22 17:12
knight828
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-10-6
收藏
得分:0 
程序代码:
k = 0
For i = 0 To UBound(ss)
   If InStr(1, ss(i), "LOCATION  :  00AA") <> 0 Then
        n1 = i + 1
        k = k + 1
        If k > 1 Then
           Exit For
        Else
            If n1 <> 0 Then
                For j = n1 To UBound(ss)
                    HAND.Add Mid(ss(j), 1, 8)
                    COM.Add Trim(Mid(ss(j), 9, 15))
                    If InStr(1, ss(j), "              |          | BONDED | REQUEST | STKROOM | ASSIGN | MAKER |") <> 0 Then
                    Exit For
                    End If
                Next j
        End If
       End If
End If
Next i
'///////////////////////////////////////////////////////////00BB
k = 0
For i = 0 To UBound(ss)
   If InStr(1, ss(i), "LOCATION  :  00BB") <> 0 Then
        n2 = i + 1
        k = k + 1
        If k > 1 Then
           Exit For
        Else
            If n2 <> 0 Then
                For j = n2 To UBound(ss)
                    HAND.Add Mid(ss(j), 1, 8)
                    COM.Add Trim(Mid(ss(j), 9, 15))
                    If InStr(1, ss(j), "              |          | BONDED | REQUEST | STKROOM | ASSIGN | MAKER |") <> 0 Then
                    Exit For
                    End If
                Next j
        End If
       End If
End If
Next i

'///////////////////////////////////////////////////////////00CC
k = 0
For i = 0 To UBound(ss)
   If InStr(1, ss(i), "LOCATION  :  00CC") <> 0 Then
        n3 = i + 1
        k = k + 1
        If k > 1 Then
           Exit For
        Else
            If n3 <> 0 Then
                For j = n3 To UBound(ss)
                    HAND.Add Mid(ss(j), 1, 8)
                    COM.Add Trim(Mid(ss(j), 9, 15))
                    If InStr(1, ss(j), "              |          | BONDED | REQUEST | STKROOM | ASSIGN | MAKER |") <> 0 Then
                    Exit For
                    End If
                Next j
        End If
       End If
End If
取第一次出现的00AA,第二次取到,直接跳出!只是代码有点多,要精简一下。
2014-11-22 17:53
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:20 
程序代码:
Dim s As String, b() As String
Open ypdialog.FileName  For Input As #1
While Not EOF(1)
  Line Input #1, s
  If InStr(s, ":") = 0 And InStr(s, "|") = 0 And Len(s) > 0 Then
    b = Split(s, " ")
    COM.Add b(1)
    HAND.Add b(0)
  End If
Wend
Close #1
就上述这么多代码,集合内得到的内容完全正确,比你的过滤的更彻底(你代码运行后会出现空格、LOCATION、|等需要过滤掉的标识符)。
2014-11-22 20:27
knight828
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-10-6
收藏
得分:0 
回复 6 楼 xzlxzlxzl
如果是load数据,bz的当然可以;我的程序必须取“00AA”“00BB”“00CC”etc作为ID(i)标示所取得的数据段;而且数据内还有其他集合,并不仅仅这一点!
TKS!
2014-11-23 21:04
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
回复 7 楼 knight828
你提供的代码完成了你所说的功能?无论是分析还是运行调试都没发现你说的什么“etc作为ID(i)标示所取得的数据段”,更没有看到什么集合内的集合。可能我out了。
说了许多,其实我只想说:虽然已经结构化、面向对象编程,系统内存也足够大了,但仍然还是要讲究算法、讲究编程技巧的,用一大堆重复代码堆出一个小小的功能是不会让人体会到编程的乐趣的。

[ 本帖最后由 xzlxzlxzl 于 2014-11-24 07:39 编辑 ]
2014-11-24 07:34
快速回复:特定字符间循环取字符串处理
数据加载中...
 
   



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

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