我现在这个字段里的内容显示在某个excel表的某一列当中,比如:1 x 5503,2 x 4402 如果有若干行,要从若干行里到5503的数量有多少?该用什么算法合适?用字符串去匹配,这样效率高吗?
貌似当做一个整字符串,然后用split去分割最后用ubound统计个数比较快
我现在有这样的情况:某个一列里,有这样的数据: 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 就是这样串还有很多,如何去匹配求出每个前面的数量累加.
如果数据库是海量的话可否考虑用数据库存放,然后用group by查询语句呢?
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
把字符串一个个分离,并不是这一行这一列里,就只有单一的方式,如1 x 5503。还有可能这行这列会有这样的情况:1 x 2305,2 x 1204,1 x 1104等情况。就是每读到这一行这一列的时候,先得给它存到数组里处理,还是存到数据库里处理,不知道哪种效率更高?也就是把把这一行这一列的的"1 x 2305,2 x 1204,1 x 1104"先以","分割,分离成三个,然后再分离出"x"符号的左右两边。
我现在,这一列数据是在 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,数量继续累加。 直到读到某行某个编号的数量比库存数量大时,异常提示。
数据库设计不合理。应该这样: 1 每一行只记录一个编号;2 编号和数量分开不同的列。数量 | 编号 1 | 3302 1 | 203 1 | 2201 1 | 4503 1 | 2201这样的话,直接把 Excel 当作外部数据库,用 SQL 查询:SELECT 编号, Count(数量) AS 小计 FROM Sheet1$ GROUP BY 编号;直接获得你要的结果。
如果是这样的字符串呢?1 X VDCEMC91U , 1 X CVA_8901 匹配串,正则表达式怎么写?
那就只好代码逐项处理了。下面是一个借助 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
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
还是上次的写正则表达式的问题,您看看。 您的正则表达式确实解决了很多问题,我现在有这样的困惑。上次给您看的组成的字符串里有这样的情况: 比如,(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前的数字写到前面去了,也希望能有提示。谢谢您。
如果有若干行,要从若干行里到5503的数量有多少?该用什么算法合适?用字符串去匹配,这样效率高吗?
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
就是这样串还有很多,如何去匹配求出每个前面的数量累加.
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
可以通过函数处理,把字符串一个个拆开。
最后统计一下。
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,数量继续累加。
直到读到某行某个编号的数量比库存数量大时,异常提示。
1 每一行只记录一个编号;2 编号和数量分开不同的列。数量 | 编号
1 | 3302
1 | 203
1 | 2201
1 | 4503
1 | 2201这样的话,直接把 Excel 当作外部数据库,用 SQL 查询:SELECT 编号, Count(数量) AS 小计 FROM Sheet1$ GROUP BY 编号;直接获得你要的结果。
匹配串,正则表达式怎么写?
reg.Pattern = "(\d+)\s*x\s*([\da-zA-Z_]+)"
reg.IgnoreCase = True因为你x和X都用上了,上面代码表示忽略大小写
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
您的正则表达式确实解决了很多问题,我现在有这样的困惑。上次给您看的组成的字符串里有这样的情况:
比如,(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前的数字写到前面去了,也希望能有提示。谢谢您。