以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  请教在字符串中提取特定文字  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=24767)

--  作者:szp2012
--  发布时间:2012/10/22 20:19:00
--  请教在字符串中提取特定文字

[upload=xls,book1.xls]viewFile.asp?ID=21650[/uploajian

见附件。

A列为备注文字,整体无规律,但内中含有“零壹贰..玖”中文大写和“/吨”,如“零伍/吨”,但是前后文字无规律。

B列为转化第一步,提取备注中的类似“零伍/吨”的子字符串,

C类讲将B列转为“05”(“/吨”删去)

d列将C列转为 数值。注意 一位数“ 1”转为 100,两位:43转为 430  05转为50 规律类推。

如直接的将A列转为  100,430等数值也可。

请教如何处理

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:book1.xls

[此贴子已经被作者于2012-10-22 20:20:26编辑过]

--  作者:狐狸爸爸
--  发布时间:2012/10/22 20:55:00
--  

这问题不简单的:

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目21.foxdb


--  作者:程兴刚
--  发布时间:2012/10/22 20:58:00
--  

提示:用逗号分割,舍去0段不要,2段不要,取1段,在用“/"分割,取0段或直接替换掉"/吨",得到的结果转换为数值,其他的留给您来做作业!


--  作者:szp2012
--  发布时间:2012/10/22 21:17:00
--  

 

[此贴子已经被作者于2012-10-23 0:11:32编辑过]

--  作者:szp2012
--  发布时间:2012/10/22 23:19:00
--  

继续请教

1.如果备注字符串中不含“零...玖”等大写中文则出错,请问如何修正代码

2.我欲将此事件转为按钮代码,e.newvalue 不知如何替代

 3自提,粤AF9437/AF9513/AF9517/A8C156/A12108/AR4136,零伍/吨.得出结果943700 错

4.自提粤A57M37陈满福/伍伍零/吨   其中中文大写不论多少都得出5700  错

貌似其中有 0-9 数字对判断有干扰,请版主修正 谢谢

或者我有想法:

1.直接判断每个字是否属于大写“零...玖“ 加入到新建数组中

2.把数组逐个替换成”0-9“并重组 05 65 17

3.判断转值 如 05转成 50 65转650

但不知代码如何写

[此贴子已经被作者于2012-10-23 0:02:52编辑过]

--  作者:飞
--  发布时间:2012/10/23 10:42:00
--  
呵呵,这个貌似得用正则,不知道论坛有没有精通正则的人
--  作者:lin_hailun
--  发布时间:2012/10/23 14:12:00
--  
 截取字符串这样,剩下的,楼主要自己努力咯。

Dim data As String = "福建阿里上看到附件sdkfj零壹贰叁肆伍陆柒捌玖/吨控件"
Dim catchs As New System.Text.RegularExpressions.Regex("[\\u96f6\\u58f9\\u8d30\\u53c1\\u8086\\u4f0d\\u9646\\u67d2\\u634c\\u7396]+(/\\u5428){1}")
Dim mc As System.Text.RegularExpressions.MatchCollection = catchs.Matches(data)
If mc.Count <> 0 Then
    msgbox(mc(0).Value.SubString(0, mc(0).Value.IndexOf("/")))
End If
[此贴子已经被作者于2012-10-23 14:24:25编辑过]

--  作者:szp2012
--  发布时间:2012/10/23 20:02:00
--  
看不懂
--  作者:szp2012
--  发布时间:2012/10/23 20:47:00
--  

我估计问题的关键是字符串中“0-9”数字干扰是关键,所以先行踢去“0-9”

 请狐爸修改一下代码 期盼

 Case "第一列"
        If e.DataRow.Isnull("第一列")  Then
            e.DataRow("第三列")  = Nothing
        Else
          
            Dim nm1 As String = "零壹贰叁肆伍陆柒捌玖"
           Dim nm2 As String = "0123456789"
            \'For i As Integer = 0 To 9
                \'vs = vs.replace(nm1(i),nm2(i))
           \' Next
        Dim vs As String = e.NewValue
            For Each c As Char In vs
              
                Dim v As String
                     If Char.IsDigit(c) =False  Then
                    v = v & c
                \'ElseIf v > "" Then
                   \' Exit For
                End If
            Next
         e.DataRow(第三列")  = cv
     End If
\'            Dim v As String
\'            Dim s As Double
\'       For Each c1 As Char In vs
\'                If m1.contain(c) Then
\'                   Dx().add(c1)
\'               End If
\'                 
\'
\'
\'
\'
\'                       s = v
\'            For Each c As Char In v
\'                If c = "0" Then
\'                    s = s / 10
\'                Else
\'                    Exit For
\'                End If
\'            Next
\'            If s<10 Then
\'                e.DataRow("第二列")  = s * 100
\'            Else
\'                e.DataRow("第二列")  = s * 10
\'            End If
\'        End If   
\'           
 End Select

[此贴子已经被作者于2012-10-23 20:48:02编辑过]

--  作者:lin_hailun
--  发布时间:2012/10/24 11:56:00
--  
 呃……代码这样写。测试有效。

For Each dr As DataRow In DataTables("表A").DataRows
    Dim data As String = dr("第一列")
    Dim catchs As New System.Text.RegularExpressions.Regex("[\\u96f6\\u58f9\\u8d30\\u53c1\\u8086\\u4f0d\\u9646\\u67d2\\u634c\\u7396]+(/\\u5428){1}")
    Dim mc As System.Text.RegularExpressions.MatchCollection = catchs.Matches(data)
    If mc.Count <> 0 Then
        Dim val As String = mc(0).Value.SubString(0, mc(0).Value.IndexOf("/"))  \'得到的大写数值
        Dim chs As String = "零壹贰叁肆伍陆柒捌玖"
        Dim nbs As String = "0123456789"

        Dim num As Double = 0
        Select Case val.Length
            Case 1
                num = nbs(chs.IndexOf(val)).ToString() * 100
            Case Else
                If val(0) = "零" Then
                    For i As Integer = 1 To val.Length - 1
                        num = num + nbs(chs.IndexOf(val(i))).ToString() * 10 ^ (2-i)
                    Next
                Else
                    For i As Integer = 0 To val.Length - 1
                        num = num + nbs(chs.IndexOf(val(i))).ToString() * 10 ^ (val.Length-i)
                    Next
                End If
        End Select
        dr("第二列") = num
    End If
Next
[此贴子已经被作者于2012-10-24 12:00:46编辑过]