我现在字段里有这样的字符串,如:1 x535,1 x 535L,1x 5204,2 x 4345这样的字符串里,如何提取得到最前面的数字。因为这个数字后跟空格,再跟x,再有空格?是不是字符串匹配的内容?

解决方案 »

  1.   

    我现在这个字段里的内容显示在某个excel表的某一列当中,比如:1 x 5503,2 x 4402
    如果有若干行,要从若干行里到5503的数量有多少?该用什么算法合适?用字符串去匹配,这样效率高吗?
      

  2.   

    貌似当做一个整字符串,然后用split去分割最后用ubound统计个数比较快
      

  3.   

    我现在有这样的情况:某个一列里,有这样的数据:
    1 x 5503,2x 3402
    2 x 231
    1 x 4602
    1 x 2121
    1 x 1290
    2 x 5503
    1 x 4602
    1 x 2121
    1 x 231
     现在要对这一串字符串做如下计算:
    5503 3
    3402 2
    231  3
    4602 2
    2121 2
    1290 1
    就是这样串还有很多,如何去匹配求出每个前面的数量累加.
      

  4.   

    如果数据库是海量的话可否考虑用数据库存放,然后用group by查询语句呢?
      

  5.   

    Private Sub Form_Load()
        Dim dic As Object, tmp
        Dim strData As String
        Dim reg As Object
        Dim matchs As Object, match As Object    strData = "1 x 5503,2x 3402" & vbCrLf & _
                  "2 x 231" & vbCrLf & _
                  "1 x 4602" & vbCrLf & _
                  "1 x 2121" & vbCrLf & _
                  "1 x 1290" & vbCrLf & _
                  "2 x 5503" & vbCrLf & _
                  "1 x 4602" & vbCrLf & _
                  "1 x 2121" & vbCrLf & _
                  "1 x 231"    Set dic = CreateObject("scripting.dictionary")
        Set reg = CreateObject("vbscript.regExp")
        reg.Global = True
        reg.Pattern = "(\d+)\s*x\s*(\d+)"
        Set matchs = reg.Execute(strData)
        For Each match In matchs
            dic(match.SubMatches(1)) = dic(match.SubMatches(1)) + Val(match.SubMatches(0))
        Next
        
        For Each tmp In dic.keys
            Debug.Print tmp & vbTab & dic(tmp)
        Next
    End Sub
    输出:
    5503    3
    3402    2
    231 3
    4602    2
    2121    2
    1290    1
      

  6.   

    八楼正则表达式用得不错。如果说是在EXCEL中某一列的话,
    可以通过函数处理,把字符串一个个拆开。
    最后统计一下。
      

  7.   

    把字符串一个个分离,并不是这一行这一列里,就只有单一的方式,如1 x 5503。还有可能这行这列会有这样的情况:1 x 2305,2 x 1204,1 x 1104等情况。就是每读到这一行这一列的时候,先得给它存到数组里处理,还是存到数据库里处理,不知道哪种效率更高?也就是把把这一行这一列的的"1 x 2305,2 x 1204,1 x 1104"先以","分割,分离成三个,然后再分离出"x"符号的左右两边。
      

  8.   

    我现在,这一列数据是在 excel某一列,我读数据是一行行读取的。如这一列组成是这样的:
    1 x 3302,1 x 203
    1 x 2201
    1 x 4503
    1 x 2201
    读取第一行,先根据逗号分割开,分割成两个:1 x 3302和1 x 203。然后再取出3302,数量为1,在取出203,数量为1.读下一行,如果有新的编号,另外累计。如果又遇到3302,数量继续累加。
    直到读到某行某个编号的数量比库存数量大时,异常提示。
      

  9.   

    数据库设计不合理。应该这样:
    1 每一行只记录一个编号;2 编号和数量分开不同的列。数量 | 编号
    1 | 3302
    1 | 203
    1 | 2201
    1 | 4503
    1 | 2201这样的话,直接把 Excel 当作外部数据库,用 SQL 查询:SELECT 编号, Count(数量) AS 小计 FROM Sheet1$ GROUP BY 编号;直接获得你要的结果。
      

  10.   

    如果是这样的字符串呢?1  X  VDCEMC91U , 1  X  CVA_8901
    匹配串,正则表达式怎么写?
      

  11.   

    reg.Pattern = "(\d+)\s*x\s*(\d+)" 改成:
    reg.Pattern = "(\d+)\s*x\s*([\da-zA-Z_]+)"
      

  12.   

    另外还要加行代码:
    reg.IgnoreCase = True因为你x和X都用上了,上面代码表示忽略大小写
      

  13.   

    那就只好代码逐项处理了。下面是一个借助 ListBox 统计的例子,假定数据已经放在 TextBox 中。Option Explicit
    Private Declare Function SendMessagebyString Lib _
    "user32" Alias "SendMessageA" (ByVal hWND As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, _
    ByVal lParam As String) As LongPrivate Const LB_FINDSTRINGEXACT = &H1A2Private Sub Command1_Click()
    Dim strData As String
    Dim strLine() As String, strItem() As String, strPara() As String
    Dim i As Long, j As Long, n As Long    strData = Text1
        
        strData = Replace(strData, "X", "x")
        strData = Replace(strData, " ", "")
        
        strLine = Split(strData, vbCrLf)
        
        List1.Clear
        For i = 0 To UBound(strLine)
            strItem = Split(strLine(i), ",")
            
            For j = 0 To UBound(strItem)
                strPara = Split(strItem(j), "x")
                
                If UBound(strPara) = 1 Then
                    n = SendMessagebyString(List1.hWND, LB_FINDSTRINGEXACT, -1, strPara(1))
                    
                    If n = -1 Then
                        List1.AddItem strPara(1)
                        List1.ItemData(List1.NewIndex) = Val(strPara(0))
                    Else
                        List1.ItemData(n) = List1.ItemData(n) + Val(strPara(0))
                    End If
                End If
            Next j
        Next i
            
        'show result
        For i = 0 To List1.ListCount - 1
            Debug.Print List1.List(i), List1.ItemData(i)
        Next i
    End SubPrivate Sub Form_Load()
        Text1 = "1 x 5503,2x 3402" & vbCrLf & _
            "2 x 231" & vbCrLf & _
            "1 x 4602" & vbCrLf & _
            "1 x 2121" & vbCrLf & _
            "1 x 1290" & vbCrLf & _
            "2 x 5503" & vbCrLf & _
            "1 x 4602" & vbCrLf & _
            "1 x 2121" & vbCrLf & _
            "1 x 231"
        List1.Visible = False
    End Sub5503           3 
    3402           2 
    231            3 
    4602           2 
    2121           2 
    1290           1 
      

  14.   

    还是上次的写正则表达式的问题,您看看。
    您的正则表达式确实解决了很多问题,我现在有这样的困惑。上次给您看的组成的字符串里有这样的情况:
    比如,(1)1  X  CVA_8901,1  X  ABC,2 X CAD;
         (2)1 x cva202
         (3)2x DEE15043, DEA20201  该情况如何分离
          (4)2 x DEE150431 x DEA20201 这种情况
    您能否再看看,当出现(3)因为一个是没有匹配出数量,有提示;(4)这种情况,x前的数字写到前面去了,也希望能有提示。谢谢您。