注册 登录
编程论坛 VFP论坛

字符串替换求助!

wangguowu 发布于 2023-04-18 21:52, 1453 次点击
一个字段因列转行,字段内有重复的字符,需要的去除多余的!

原字段内容:(张三、张三、李四)
                 要:(张三、李四)         这样的效果!
水平有限又来麻烦大家了,每次都能得到圆满的解决!首先先谢谢了!
不知用这个CHRTRANC怎么用!
18 回复
#2
sdta2023-04-18 23:05
lcStr = "张三、张三、李四"
ALINES(laStr, lcStr, "、")
lcStr = SPACE(0)
FOR ln = 1 TO ALEN(laStr, 1)
    IF NOT laStr[ln] $ lcStr
        lcStr = lcStr + "、" + laStr[ln]
    ENDIF
ENDFOR
? SUBSTR(lcStr, 3)
#3
csyx2023-04-18 23:11
以下是引用sdta在2023-4-18 23:05:43的发言:

lcStr = "张三、张三、李四"
ALINES(laStr, lcStr, "、")
lcStr = SPACE(0)
FOR ln = 1 TO ALEN(laStr, 1)
    IF NOT laStr[ln] $ lcStr
        lcStr = lcStr + "、" + laStr[ln]
    ENDIF
ENDFOR
? SUBSTR(lcStr, 3)

不带分隔符来判断包含是不行的,假设 lcStr = "张三丰、张三、张三、李四",会得到什么?
#4
sdta2023-04-18 23:38
以下是引用csyx在2023-4-18 23:11:36的发言:


不带分隔符来判断包含是不行的,假设 lcStr = "张三丰、张三、张三、李四",会得到什么?

现在想想带分隔符也没用。
lcStr = "王张三、张三、张三、李四"
暂时的方法是用临时表处理了。
#5
sdta2023-04-18 23:44
lcStr = "张三、张三、李四"
ALINES(laStr, lcStr, "、")
DIMENSION laStr[ALEN(laStr, 1), 1]
CREATE CURSOR tt (xm c(10))
INSERT INTO tt FROM ARRAY laStr
SELECT DISTINCT xm FROM tt INTO ARRAY laStr
lcStr = SPACE(0)
FOR ln = 1 TO ALEN(laStr, 1)
    lcStr = lcStr + "、" + ALLTRIM(laStr[ln])
ENDFOR
? SUBSTR(lcStr, 3)
#6
wangguowu2023-04-19 08:14
回复 5楼 sdta
塮谢能用@
#7
wangguowu2023-04-19 21:41
回复 5楼 sdta
将上面的程序
能写通用型针对字段操作替换的函数吗?谢谢!
#8
sdta2023-04-19 22:21
是不是这个意思
程序代码:
CLEAR
CREATE CURSOR test (xm c(20))
INSERT INTO test VALUES ("张三、张三、李四")
INSERT INTO test VALUES ("刘三、李四、刘三")
INSERT INTO test VALUES ("李四江、刘三、李四、刘三")
SCAN
    ? fwr(xm)
ENDSCAN
FUNCTION fwr(lcStr)
    ALINES(laStr, lcStr, 4+1, "、")
    DIMENSION laStr[ALEN(laStr, 1), 1]
    CREATE CURSOR tt (xm c(10))
    INSERT INTO tt FROM ARRAY laStr
    SELECT DISTINCT xm FROM tt INTO ARRAY laStr
    lcStr = SPACE(0)
    FOR ln = 1 TO ALEN(laStr, 1)
        lcStr = lcStr + "、" + ALLTRIM(laStr[ln])
    ENDFOR
    RETURN SUBSTR(lcStr, 3)
ENDFUNC
RETURN
#9
wangguowu2023-04-19 23:01
回复 8楼 sdta
谢谢明天我试一下@
#10
iswith2023-04-20 07:36
lcStr = "张三、张三、李四"
?strtran(lcStr , '张三、' , '' )
#11
吹水佬2023-04-20 09:40
只有本站会员才能查看附件,请 登录

程序代码:
CREATE CURSOR test (xm c(30))
INSERT INTO test VALUES ("张三、张三、李四")
INSERT INTO test VALUES ("刘三、李四、刘三")
INSERT INTO test VALUES ("李四江、刘三、李四、刘三")
SELECT *, PADR(fun(),30," ") new_xm FROM test

FUNCTION fun()
    ALINES(arr,xm,15,"、")
    DIMENSION tmp[ALEN(arr)]
    tmp[1] = arr[1]
    ret = arr[1]
    k = 1
    FOR i=2 TO ALEN(arr)
        IF ASCAN(tmp,arr[i],1,-1,-1,15) == 0
            k = k + 1
            tmp[k] = arr[i]
            ret = ret + "、" + arr[i]
        ENDIF
    ENDFOR
    RETURN ret
ENDFUNC
#12
wangguowu2023-04-20 10:02
回复 8楼 sdta
这个可以用,但列转行不止姓名一列,有:证件类型,证件号码等多个字段,是否要分别建不同函数名来对字段操作!
#13
sdta2023-04-20 10:04
上传相关文件看看
#14
wangguowu2023-04-20 10:05
回复 11楼 吹水佬
谢谢你,问题同上!
#15
wangguowu2023-04-20 10:44
回复 13楼 sdta
只有本站会员才能查看附件,请 登录
#16
sdta2023-04-20 11:00
以下是引用wangguowu在2023-4-20 10:02:28的发言:

这个可以用,但列转行不止姓名一列,有:证件类型,证件号码等多个字段,是否要分别建不同函数名来对字段操作!

没明白意思
#17
吹水佬2023-04-20 11:22
回复 11楼 吹水佬
精简一下
程序代码:
CREATE CURSOR test (xm c(30))
INSERT INTO test VALUES ("张三、张三、李四")
INSERT INTO test VALUES ("刘三、李四、刘三")
INSERT INTO test VALUES ("李四江、刘三、李四、刘三")
SELECT *, PADR(fun(),30," ") new_xm FROM test

FUNCTION fun()
    ALINES(arr,xm,15,"、")
    ret = arr[1]
    FOR i=2 TO ALEN(arr)
        IF ASCAN(arr,arr[i],1,-1,-1,15) >= i
            ret = ret + "、" + arr[i]
        ENDIF
    ENDFOR
    RETURN ret
ENDFUNC
#18
吹水佬2023-04-20 11:26
以下是引用wangguowu在2023-4-20 10:02:28的发言:

这个可以用,但列转行不止姓名一列,有:证件类型,证件号码等多个字段,是否要分别建不同函数名来对字段操作!

转来转去有点麻烦
数据结构优化一下算法也许会简单些
#19
wangguowu2023-04-20 13:02
回复 16楼 sdta
就是按权利人类别分组,其宅各列列转行!这个
数据要在报表中使用@
1