以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]多种格式的二维码  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=85134)

--  作者:huhu
--  发布时间:2016/5/18 16:27:00
--  [求助]多种格式的二维码
二维码有好几种格式组合,
比如下面这4种。
SN,MAC,H/W
SN,H/W
SN,MAC
MAC,H/W
在datacolchanging,如何用select case来处理这4种情况?都用if ,会顺序执行,会重复。
If e.DataCol.Name = "SN" Then
    Dim str As String = e.NewValue
    If str.Contains("SN:") And str.Contains("MAC:") And str.Contains("H/W:") Then
        Dim idx1 As Integer = str.IndexOf("MAC:")
        Dim idx2 As Integer = str.IndexOf("H/W:")
        e.DataRow("MAC") = str.substring(idx1+4, idx2-idx1-5)
        e.DataRow("HW") = str.substring(idx2+5)
        e.NewValue = str.SubString(3, idx1-3)
    End If
End If

--  作者:大红袍
--  发布时间:2016/5/18 16:44:00
--  

1、贴出各种数据,说明要截取什么东西

 

2、尽量做例子发上来。


--  作者:huhu
--  发布时间:2016/5/19 6:01:00
--  
第一种,SN:,MAC:,H/W:都有的。如:SN:20013040158 MAC:00:E0:0F:00:00:01 H/W:VERSION2.2.2.0
第二种,仅有SN:,MAC:。如:SN:20013040158 MAC:00:E0:0F:00:00:01 
第三种,仅有SN:,H/W:。如:SN:20013040158  H/W:VERSION2.2.2.0
第四种,仅有MAC:,H/W:。如:MAC:00:E0:0F:00:00:01 H/W:VERSION2.2.2.0
想实现目的为:
扫描二维码,先看看是上面哪一种格式,写入数据前先判断一下。
如果是第一种格式,那么SN列,MAC列,HW列的值分别为20013040158,00:E0:0F:00:00:01,VERSION2.2.2.0
如果是第二种格式,那么SN列,MAC列的值分别为20013040158,00:E0:0F:00:00:01,且HW列的值为空
如果是第三种格式,那么SN列,HW列的值分别为20013040158,VERSION2.2.2.0,且MAC列的值为空
如果是第四种格式,那么MAC列,HW列的值分别为00:E0:0F:00:00:01,VERSION2.2.2.0,且SN列的值也为MAC列的值00:E0:0F:00:00:01





--  作者:Hyphen
--  发布时间:2016/5/19 8:47:00
--  
If e.DataCol.Name = "SN" Then
    Dim str As String = e.NewValue
    Dim idx1 As Integer = str.IndexOf("MAC:")
    Dim idx2 As Integer = str.IndexOf("H/W:")
    Dim length As Integer
    If str.Contains("SN:") Then
        length  = IIF(idx1 <> -1,idx1-3,IIF(idx2 <> -1,idx2-4,str.Length - 3))
        e.NewValue = str.SubString(3, length)
    Else
        e.NewValue =Nothing
    End If
    If str.Contains("MAC:") Then
        If idx2 = -1 Then
            e.DataRow("MAC") = str.SubString(idx1+4)
        Else
            e.DataRow("MAC") = str.SubString(idx1+4, idx2-idx1-4)
        End If
    End If
    If str.Contains("H/W:") Then
        e.DataRow("HW") = str.substring(idx2+4)
    End If
End If

--  作者:大红袍
--  发布时间:2016/5/19 9:21:00
--  

这种那个,直接用正则获取

 

Dim str As String = "SN:20013040158 MAC:00:E0:0F:00:00:01 H/W:VERSION2.2.2.0"

Dim mc = System.Text.RegularExpressions.Regex.Matches(str, "(?<=SN:).+?(?= |MAC|H/W|$)")
msgbox(mc.count)
If mc.count > 0 Then
    msgbox(mc(0).value)
End If
mc = System.Text.RegularExpressions.Regex.Matches(str, "(?<=MAC:).+?(?= |SN|H/W|$)")
msgbox(mc.count)
If mc.count > 0 Then
    msgbox(mc(0).value)
End If
mc = System.Text.RegularExpressions.Regex.Matches(str, "(?<=H/W:).+?(?= |MAC|SN|$)")
msgbox(mc.count)
If mc.count > 0 Then
    msgbox(mc(0).value)
End If

 


--  作者:huhu
--  发布时间:2016/5/19 14:32:00
--  
4楼的代码看懂了。
大红袍的正则表达式的暂时没看懂。
现在的情况是手机扫描二维码显示结果为:
SN:S21037742 MAC:00:e0:0f:4c:af:a6 
H/W:MFRP0160040440EE00
用扫描枪去扫这个二维码结果显示为:
SN:S21037742 
MAC:00:e0:0f:4c:af:a6 
H/W:MFRP0160040440EE00

SN,MAC,H/W自动换行。这样对SN列相当于是弄了3行数据,而实际上应该为一行数据,SN列,MAC列,H/W列各自取各自的值。
这种情况该怎么解决?

--  作者:大红袍
--  发布时间:2016/5/19 14:49:00
--  

 去看一下扫描枪的说明书,设置一下内容之间不要用回车分割;或者是设置一下扫描枪的起始符和结束符。


--  作者:huhu
--  发布时间:2016/5/19 15:07:00
--  
去看一下扫描枪的说明书,设置一下内容之间不要用回车分割;或者是设置一下扫描枪的起始符和结束符。

一定要这么做吗?
不这么做可以吗?我们软件是否可以自行处理呢?

--  作者:大红袍
--  发布时间:2016/5/19 15:10:00
--  
 不可以。不能和回车键冲突,不然不知道什么时候算一次扫描啊。