注册 登录
编程论坛 VFP论坛

请问大侠,VFP如何去掉一行字符中的括号及括号中内容?

甲辰 发布于 2021-11-10 17:57, 3713 次点击
请问大侠,VFP如何去掉一行字符中的括号及括号中内容?
如:[01次]面包[02次]生菜 替换为 面包生菜
    [01次]80,[02次]92,  替换为 80,92,


[此贴子已经被作者于2021-11-10 17:58编辑过]

31 回复
#2
foxfans2021-11-10 18:12
c="[01次]80,[02次]92,"
n=OCCURS(",",c)
z=''
FOR i=1 TO n
z=z+STREXTRACT(c,']',[,],i)+","
ENDFOR
?z
#3
甲辰2021-11-10 18:50
谢谢大侠!但处理结果还不行,请看帖子
以下是引用foxfans在2021-11-10 18:12:27的发言:

c="[01次]80,[02次]92,"
n=OCCURS(",",c)
z=''
FOR i=1 TO n
z=z+STREXTRACT(c,']',[,],i)+","
ENDFOR
?z

========================
c=thisform.edit3.Value
n=OCCURS(",",c)
z=""
FOR i=1 TO n
z=z+STREXTRACT(c,']',[,],i)+","
ENDFOR

thisform.edit2.Value=z
===============================
一是:数据只提取]后面的一位数
二是:二行以上的数据,处理后变成一行。


[此贴子已经被作者于2021-11-10 20:21编辑过]

#4
吹水佬2021-11-10 19:49
扫描一次字符串好了,“[”开始舍弃,“]”结束舍弃
#5
甲辰2021-11-10 19:58
大侠好,扫描的代码如何写?
以下是引用吹水佬在2021-11-10 19:49:30的发言:

扫描一次字符串好了,“[”开始舍弃,“]”结束舍弃

扫描的代码如何写?
#6
laowan0012021-11-10 20:31
LOCAL xchr,xsubchr
*xchr = "[44次]13,35,[43次]07,46,[42次]14,33"
xchr = "[01次]面包[02次]生菜"

DO WHILE .T.
    xsubchr = STREXTRACT(xchr,'[',']')
    IF LEN(xsubchr)=0
        EXIT
    ENDIF
    xchr = STRTRAN(xchr,'['+xsubchr+']','')
ENDDO

MESSAGEBOX( xchr)
#7
吹水佬2021-11-10 21:20
以下是引用甲辰在2021-11-10 19:58:20的发言:


扫描的代码如何写?

程序代码:
? fun("[01次]面包[02次]生菜") && 面包生菜
? fun("[01次]80,[02次]92")  && 80,92

FUNCTION fun(s)
    ret = ""
    bg = .T.
    FOR i=1 TO LEN(s)
        ch = SUBSTR(s,i,1)
        IF ch == "["
            bg = .F.
            LOOP
        ELSE
            IF ch == "
]"
                bg = .T.
                LOOP
            ENDIF
        ENDIF
        IF bg
            ret = ret + ch
        ENDIF
    ENDFOR
    RETURN ret
ENDFUNC
#8
foxfans2021-11-10 21:21
? fun("[01次]面包[02次]生菜") && 面包生菜
? fun("[01次]80,[02次]92")  && 80,92
FUNCTION Fun(cc)
    z=''
    n=ALINES(ss,cc,4,"]","[")
    FOR n=1 TO n STEP 2
      z=z+ss(n+1)
    ENDFOR
    RETURN z
ENDFUNC
Vfp这类函数很多,自己灵活使用

[此贴子已经被作者于2021-11-10 21:27编辑过]

#9
吹水佬2021-11-10 22:06
程序代码:

s = "[01次]面包,[02次]生菜,[01次]80,[02次]92"
?fun(s)

FUNCTION fun(s)
    p1 = AT("[",s)
    p2 = AT("
]",s)
    DO WHILE p1>0 AND p2>p1
        s = STUFF(s,p1,p2-p1+1,"")
        p1 = AT("[",s)
        p2 = AT("
]",s)
    ENDDO
    RETURN s
ENDFUNC
#10
甲辰2021-11-10 22:08
谢谢,辛苦了!
以下是引用laowan001在2021-11-10 20:31:57的发言:

LOCAL xchr,xsubchr
*xchr = "[44次]13,35,[43次]07,46,[42次]14,33"
xchr = "[01次]面包[02次]生菜"

DO WHILE .T.
    xsubchr = STREXTRACT(xchr,'[',']')
    IF LEN(xsubchr)=0
        EXIT
    ENDIF
    xchr = STRTRAN(xchr,'['+xsubchr+']','')
ENDDO

MESSAGEBOX( xchr)


谢谢,辛苦了!
#11
甲辰2021-11-10 22:11
回复 8楼 foxfans
谢谢,辛苦了!
#12
schtg2021-11-11 05:56
学习啦,谢谢!
#13
dbf永动机2022-09-05 13:15
如果只有【】和01,02 是不想要的,直接用: repl all 列名 with chrt(列名,'【】012','')   即可
#14
sam_jiang2022-09-05 21:30
以下是引用dbf永动机在2022-9-5 13:15:25的发言:

如果只有【】和01,02 是不想要的,直接用: repl all 列名 with chrt(列名,'【】012','')   即可



还有中文“次”也要去掉,就这个问题而言,你这个最简单。测试了一下,结果不正确,它把80,92 里面的0和2 也给去掉了。


[此贴子已经被作者于2022-9-5 21:36编辑过]

#15
laowan0012022-09-05 21:44
还是用strtran吧,这样把握更大些
#16
sam_jiang2022-09-05 21:50
如果你这格式是固定的,那么4句代码就可以搞定。
cstr="[01次]面包,[02次]生菜,[01次]80,[02次]92"
cstr=STRTRAN(cstr,"[01次]","")
cstr=STRTRAN(cstr,"[02次]","")
?cstr
#17
aqyejun2022-09-06 08:32
#18
dbf永动机2022-09-06 08:56
回复 14楼 sam_jiang
所以一开始我说的只有01,02,这样的数字用这个命令,如果还有其他数字,先把括号用chrt替换空,再用strt把01和02分别替换成空
#19
nikon2022-09-07 23:16
不是有个现成的函数吗?CHRTRAN/CHRTRANC,一次全部搞定。
#20
吹水佬2022-09-08 07:15
以下是引用nikon在2022-9-7 23:16:33的发言:

不是有个现成的函数吗?CHRTRAN/CHRTRANC,一次全部搞定。

没那么简单吧,"[01]xx01,[02]XX02"呢
#21
dbf永动机2022-09-08 09:02
回复 20楼 吹水佬
所以说要看具体数据,这种情况就用at呗,subs 后面用at,截取的位置就是读取括号前后的位置
#22
wangguowu2022-12-19 21:51
回复 4楼 吹水佬

一个字段内内容:"琼(2022)洋县不动产权第0021221号、琼(2020)洋县不动产权第0021221号/琼(2021)洋县不动产权第0021221号"

如何取成这样的数据:0021221、0021221/0021221
谢谢
#23
sdta2022-12-19 22:13
以下是引用wangguowu在2022-12-19 21:51:42的发言:


一个字段内内容:"琼(2022)洋县不动产权第0021221号、琼(2020)洋县不动产权第0021221号/琼(2021)洋县不动产权第0021221号"

如何取成这样的数据:0021221、0021221/0021221
谢谢

试试 STREXTRACT( ) 函数
#24
wangguowu2022-12-19 22:53
回复 23楼 sdta
我结合6楼和16楼的方法搞出来了,不知用在字段内容处理上有没有更简洁的方法,请不吝赐教!
#25
wangguowu2022-12-20 12:22
回复 24楼 wangguowu
Clear
Local xchr,xsubchr,cstr
cstr="琼(2018)洋县不动产证明第0038826号/琼(2019)洋县不动产证明第0038827号、琼(2017)洋县不动产证明第0038823号"
cstr=Chrtranc(cstr,"琼洋县不动产证明第号","")
Messagebox(cstr)
xchr=cstr
Do While .T.
   xsubchr=Strextract(xchr,"(",")")
   If Len(xsubchr)=0
      Exit
   Endif
   xchr=Strtran(xchr,"("+xsubchr+")"," ")
Enddo
Messagebox(xchr)
#26
foxfans2022-12-20 13:14
CLEAR
m.lcTxt="琼(2022)洋县不动产权第0021221号、琼(2020)洋县不动产权第0021221号/琼(2021)洋县不动产权第0021221号"
m.nLen=ALINES(cArray,m.lcTxt,"第","号")
IF m.nLen=6
   ?cArray(2)+"、"+cArray(4)+"/"+cArray(6)
ELSE
   ?"样本数据无效"
Endif
#27
吹水佬2022-12-20 15:13
以下是引用wangguowu在2022-12-19 21:51:42的发言:


一个字段内内容:"琼(2022)洋县不动产权第0021221号、琼(2020)洋县不动产权第0021221号/琼(2021)洋县不动产权第0021221号"

如何取成这样的数据:0021221、0021221/0021221
谢谢

程序代码:

cstr="琼(2022)洋县不动产权第0021221号、琼(2020)洋县不动产权第0021221号/琼(2021)洋县不动产权第0021221号"
FOR i=1 TO ALINES(arr,cstr,16,"号","/","、")
    ?? IIF(i%2==0,arr[i],LEFT(RIGHT(arr[i],9),7))
ENDFOR
#28
吹水佬2022-12-20 15:15
回复 25楼 wangguowu
这格式也可以
程序代码:

cstr="琼(2018)洋县不动产证明第0038826号/琼(2019)洋县不动产证明第0038827号、琼(2017)洋县不动产证明第0038823号"
FOR i=1 TO ALINES(arr,cstr,16,"号","/","、")
    ?? IIF(i%2==0,arr[i],LEFT(RIGHT(arr[i],9),7))
ENDFOR

#29
wangguowu2022-12-20 22:24
回复 28楼 吹水佬
谢谢你太棒了!
#30
wangguowu2022-12-20 22:24
回复 26楼 foxfans
谢谢你太棒了!
#31
sdta2023-03-27 15:45
回复 25楼 wangguowu
这样是不是更简单
cstr="琼(2018)洋县不动产证明第0038826号/琼(2019)洋县不动产证明第0038827号、琼(2017)洋县不动产证明第0038823号"
?CHRTRANC(cstr,CHRTRANC(cstr,"()/0123456789",""),"")
#32
sdta2024-03-07 10:51
试试 alines()会有惊喜的
1