注册 登录
编程论坛 VB6论坛

特定字符间循环取字符串处理

knight828 发布于 2014-11-22 12:34, 479 次点击
只有本站会员才能查看附件,请 登录
我一文本文件,导入数组,属特定字符间循环取字符串处理问题,如附件所示,代码如下:
程序代码:
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


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

7 回复
#2
xzlxzlxzl2014-11-22 14:06
没办法,你文本文件sn.txt里的“LOCATION  :  00AA”有两个。
我觉得你不过是想把特定格式的文本读入到集合hand、com中,完全可以简化代码达到相同效果的,总代码应该只需你的1/3即可完成。
#3
knight8282014-11-22 17:07
回复 2 楼 xzlxzlxzl
这是我为调试的新做的代码,双for,故而被load两次!
#4
knight8282014-11-22 17:12
集合也不止这两个,“LOCATION  :  00AA”里的00AA相当于一个集合的标识,做成一个集合放在数组第一列,以标识数据归类。
有没有办法,一次性跳出双for?
tks!
#5
knight8282014-11-22 17:53
程序代码:
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,第二次取到,直接跳出!只是代码有点多,要精简一下。
#6
xzlxzlxzl2014-11-22 20:27
程序代码:
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、|等需要过滤掉的标识符)。
#7
knight8282014-11-23 21:04
回复 6 楼 xzlxzlxzl
如果是load数据,bz的当然可以;我的程序必须取“00AA”“00BB”“00CC”etc作为ID(i)标示所取得的数据段;而且数据内还有其他集合,并不仅仅这一点!
TKS!
#8
xzlxzlxzl2014-11-24 07:34
回复 7 楼 knight828
你提供的代码完成了你所说的功能?无论是分析还是运行调试都没发现你说的什么“etc作为ID(i)标示所取得的数据段”,更没有看到什么集合内的集合。可能我out了。
说了许多,其实我只想说:虽然已经结构化、面向对象编程,系统内存也足够大了,但仍然还是要讲究算法、讲究编程技巧的,用一大堆重复代码堆出一个小小的功能是不会让人体会到编程的乐趣的。

[ 本帖最后由 xzlxzlxzl 于 2014-11-24 07:39 编辑 ]
1