Foxtable(狐表)用户栏目专家坐堂 → 请教在字符串中提取特定文字


  共有11773人关注过本帖树形打印复制链接

主题:请教在字符串中提取特定文字

帅哥哟,离线,有人找我吗?
szp2012
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:202 积分:1683 威望:0 精华:0 注册:2011/6/17 16:07:00
请教在字符串中提取特定文字  发帖心情 Post By: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编辑过]

 回到顶部
帅哥,在线噢!
狐狸爸爸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/10/22 20:55:00 [只看该作者]

这问题不简单的:

 

 

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


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/10/22 20:58:00 [只看该作者]

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


 回到顶部
帅哥哟,离线,有人找我吗?
szp2012
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:202 积分:1683 威望:0 精华:0 注册:2011/6/17 16:07:00
  发帖心情 Post By:2012/10/22 21:17:00 [只看该作者]

 

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

 回到顶部
帅哥哟,离线,有人找我吗?
szp2012
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:202 积分:1683 威望:0 精华:0 注册:2011/6/17 16:07:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:732 积分:5491 威望:0 精华:14 注册:2011/8/28 12:49:00
  发帖心情 Post By:2012/10/23 10:42:00 [只看该作者]

呵呵,这个貌似得用正则,不知道论坛有没有精通正则的人

 回到顶部
帅哥哟,离线,有人找我吗?
lin_hailun
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By: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
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:202 积分:1683 威望:0 精华:0 注册:2011/6/17 16:07:00
  发帖心情 Post By:2012/10/23 20:02:00 [只看该作者]

看不懂

 回到顶部
帅哥哟,离线,有人找我吗?
szp2012
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:202 积分:1683 威望:0 精华:0 注册:2011/6/17 16:07:00
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By: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编辑过]

 回到顶部