Office中国论坛/Access中国论坛

标题: 请帮助看看我想提取"G"字母后面的空格后面的两位数字 [打印本页]

作者: yanwei82123300    时间: 2013-3-14 16:54
标题: 请帮助看看我想提取"G"字母后面的空格后面的两位数字
COMP_DESC:
MODULE,PWR G01 14-00
MODULE,PWR G01 14-00
MODULE,PWR G01 14-00
MODULE,PWR G01 14-00
MODULE,PWR G4 16-11
ASSY,PWR G2 12-11*W/JSCR*
MODULE,PWR G3 20-00
结果:

14
14
14
16
11
20
作者: sxgaobo    时间: 2013-3-14 18:17
Mid([desc],InStr([desc],"-")-2,2)
作者: aslxt    时间: 2013-3-14 18:30
楼主的数据或许应该这样描述:提前字符串中第二个空格后面的两位数字?
前面的字符没有"G"出现的可能?
作者: yanwei82123300    时间: 2013-3-14 20:33
上面是物料的描述描述都包括G字母
作者: sxgaobo    时间: 2013-3-14 21:43
应以字符串中唯一的字符为判断条件啊!你那字符串中好多字母,万一重复出现G就乱套了啊!
作者: koutx    时间: 2013-3-14 22:28
为万全起见,先排除你第一个空格前可能有的字母G。并假设第一个空格后只有一个字母G,可用如下sql查询语句:
"SELECT Mid(Mid([desc],InstrRev([desc],'G')),InStr(Mid([desc],InstrRev([desc],'G')),' ')+1,2) FROM itemdetail"
作者: koutx    时间: 2013-3-14 22:32
还是都写出来吧:
Sub zfxq()
Dim str As String
str = "SELECT Mid(Mid([desc],InstrRev([desc],'G')),InStr(Mid([desc],InstrRev([desc],'G')),' ')+1,2) FROM itemdetail"
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open str, CurrentProject.Connection, adOpenStatic, adLockReadOnly
Do While Not rs.EOF
Debug.Print rs.Fields(0)
rs.MoveNext
Loop
End Sub
作者: yanwei82123300    时间: 2013-3-15 08:11
谢谢大家的帮助,请问koutx 老师您写的Sub zfxq()这个自定义函数放到哪里?是模块中吗?还是窗体中,谢谢
作者: koutx    时间: 2013-3-15 09:11
yanwei82123300 发表于 2013-3-15 08:11
谢谢大家的帮助,请问koutx 老师您写的Sub zfxq()这个自定义函数放到哪里?是模块中吗?还是窗体中,谢谢

如果只在某一个窗体用到此Recordset,就放在此窗体中。如多个窗体中用,就放在模块里了。
作者: roych    时间: 2013-3-15 12:15
yanwei82123300 发表于 2013-3-15 08:11
谢谢大家的帮助,请问koutx 老师您写的Sub zfxq()这个自定义函数放到哪里?是模块中吗?还是窗体中,谢谢

把里面的SQL语句换成查询就是了。没必要那么麻烦。
[attach]51446[/attach]
作者: yanwei82123300    时间: 2013-3-15 12:43
谢谢大家帮助:
请帮助看看如何才能去SR后面的数字呢?谢谢
COMP_DESC
MODULE,SPRING G7-SR3-00
MODULE,SPRING G7-SR4-00
MODULE,SPRING G7-SR4-00*NDT*
MODULE,SPRING G8-SR1-11
MODULE,SPRING G7-SR3-10
MODULE,SPRING G01-SR1-00*NDT*
MODULE,SPRING G7-SR3-00
MODULE,SPRING G7-SR2-00
结果:
3
4
4
1
3
1
32
作者: todaynew    时间: 2013-3-15 14:48
yanwei82123300 发表于 2013-3-15 12:43
谢谢大家帮助:
请帮助看看如何才能去SR后面的数字呢?谢谢
COMP_DESC

这是一个典型的正在表达式运用问题,解法很简单:

[attach]51447[/attach]

[attach]51448[/attach]
作者: yanwei82123300    时间: 2013-3-15 15:50
todaynew 发表于 2013-3-15 14:48
这是一个典型的正在表达式运用问题,解法很简单:

todaynew 谢谢帮助您再看看下面的能否做到:
ITEM                          desc
MVA001-084-27        MODULE,DRIVE G80-SR-00
MVA001-084-27        MODULE,DRIVE G80-SR-00
MVA001-186-01        MODULE,DRIVE G81-SR-00
M118008                          MODULE,DRIVE G70-11
MVA001-032-62        MODULE,DRIVE GC50-SR-00
M151735                           MODULE,DRIVE GC40-SR-00
M143685                          MODULE,DRIVE GC011-00
MVA000-132-90        MODULE,DRIVE GC41-SR-00
M142773                          MODULE,DRIVE G20-SR-00
M142775                          MODULE,DRIVE G30-SR-00
M130361                         MODULE,DRIVE G010-00
结果:
80
81
70
50
40
011
41
20
30
010
作者: todaynew    时间: 2013-3-15 16:23
本帖最后由 todaynew 于 2013-3-15 17:15 编辑
yanwei82123300 发表于 2013-3-15 15:50
todaynew 谢谢帮助您再看看下面的能否做到:
ITEM                          desc
MVA001-084-27        MODULE,DRIVE ...

可以这样写查询:
SELECT itemdetail.ITEM, itemdetail.desc, IIf(teststr([desc],"(G|GC)\d+"),ReplaceMatch([desc],"(^.*(?:G|GC))(\d+)(.*$)","$2"),"") AS G后的数字, IIf(teststr([desc],"SR\d+"),ReplaceMatch([desc],"(^.*SR)(\d+)(.*$)","$2"),"") AS SR后的数字
FROM itemdetail;

看到ReplaceMatch([desc],"(^.*(?:G|GC))(\d+)(.*$)","$2"),"")这个函数了吗?这个函数中的正则表达式中有这么个子串:(?:G|GC),这表示G或者GC都可以匹配。

如果还有GA,GB需要匹配的话,则可将这个子串改为::(?:G|GA|GB|GC)。

如果G后面可能是26个大写字母中的一个,则这个子串改写为:G(?:[A-Z])?。

如何处理,可以参见《无关紧要》一文。

作者: yanwei82123300    时间: 2013-3-18 15:02
todaynew 发表于 2013-3-15 16:23
可以这样写查询:
SELECT itemdetail.ITEM, itemdetail.desc, IIf(teststr([desc],"(G|GC)\d+"),Replace ...

请大家帮助看看下面这些描述如何能够提取第二个空格后面的数字(G后面数字空格后面的数字)谢谢大家
COMP_DESC
MODULE,PWR G01 12-
ASSY,PWR G2 12*W/JSCR*
MODULE,PWR G5 24
MODULE,PWR G2 10-00
MODULE,PWR G5 28-00
MODULE,PWR G01 10
MODULE,PWR G01 10
ASSY,PWR G01 10*W/JSCR*
MODULE,PWR G7 36
结果:
12
12
24
10
28
10
10
36


作者: yanwei82123300    时间: 2013-3-18 15:09
COMP_DESC
MODULE,PWR G4 20-00*PED/ENG*
MODULE,PWR G5 20-00*PED/ENG*
MODULE,PWR G5 20-00*PED/ENG*
MODULE,PWR G5 28-00*PED/ENG*
MODULE,PWR G5 16-00*PED/ENG*
MODULE,PWR G4 20-00*PED/ENG*
MODULE,PWR G01 9*PED*
MODULE,PWR G01 9*PED*
MODULE,PWR G01 9*PED*

结果:
20
20
20
28
16
9
9

作者: koutx    时间: 2013-3-18 21:45
正则表达式尚不能掌握使用,还是老办法吧:
Sub xzf()
Dim str As String
Dim rsj As ADODB.Recordset
str = "SELECT Mid([desc],InStrRev([desc],' ')+1) FROM itemdetail"
Set rsj = New ADODB.Recordset
rsj.Open str, CurrentProject.Connection, adOpenStatic, adLockReadOnly

Do While Not rsj.EOF
For i = 1 To Len(rsj.Fields(0))
    If Not IsNumeric(Mid(rsj.Fields(0), i, 1)) Then
        Debug.Print Left(rsj.Fields(0), i - 1)
        Exit For
    End If
Next
rsj.MoveNext
Loop
End Sub

作者: yanwei82123300    时间: 2013-3-19 08:16
koutx 发表于 2013-3-18 21:45
正则表达式尚不能掌握使用,还是老办法吧:
Sub xzf()
Dim str As String

koutx 老师取出的结果有问题,见图片
作者: koutx    时间: 2013-3-19 09:27
本帖最后由 koutx 于 2013-3-19 09:31 编辑

我试了没问题呀。(提取第二个空格后面的数字)
[attach]51462[/attach]
[attach]51463[/attach]
作者: yanwei82123300    时间: 2013-3-19 10:07
koutx 发表于 2013-3-19 09:27
我试了没问题呀。(提取第二个空格后面的数字)

koutx老师我更新了附件的例子,看看如何才能在查询中使用您做的模块函数呢?能否帮助修改一下例子,谢谢
作者: todaynew    时间: 2013-3-19 12:36
yanwei82123300 发表于 2013-3-18 15:09
COMP_DESC
MODULE,PWR G4 20-00*PED/ENG*
MODULE,PWR G5 20-00*PED/ENG*

IIf(teststr([desc],"\s+.*\s+\d+"),ReplaceMatch([desc],"(^.*\s+.*\s+)(\d+)(.*$)","$2"),"") AS 两个空格后的数字

\s+表示至少一个空格,\s+.*\s+\d+表示:一串连续的空格,接着是一些连续的字符,再接着一串连续的空格,然后接着连续几个数字字符。
作者: todaynew    时间: 2013-3-19 12:58
标题:
本帖最后由 todaynew 于 2013-3-19 15:22 编辑
roych 发表于 2013-3-15 12:15
把里面的SQL语句换成查询就是了。没必要那么麻烦。

呵呵,如果除了G以外,还可能是GC,GS(13楼的问题),或者其他什么字符呢?还有,空格是一个还是连续的多个怎么办呢?
所以问题为两个空格后的数字,不能简单的理解为G后一个空格后的数字。
这个问题除了用正则表达式解决外,其他都非好办法。这个结论是确定的。{:soso_e145:}
作者: yanwei82123300    时间: 2013-3-19 12:59
todaynew 谢谢帮助!!
作者: koutx    时间: 2013-3-19 13:17
查询:SELECT zqsz(Mid([desc],InStrRev([desc],' ')+1)) AS [DESC-] FROM itemdetail;

函数:
Function zqsz(ByVal csz As String)
For i = 1 To Len(csz)
    If Not IsNumeric(Mid(csz, i, 1)) Then
        zqsz = Left(csz, i - 1)
        Exit Function
    End If
Next
zqsz = csz
End Function

作者: yanwei82123300    时间: 2013-3-19 13:25
koutx 谢谢帮助!!!
作者: miracle-y    时间: 2013-3-19 14:28
学习了 这个不错




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3