注册 登录
编程论坛 VFP论坛

如何查找列数据的全部字符

fdqzy 发布于 2021-07-26 14:10, 2787 次点击
如表:
程序代码:
create cursor b1 (m1 c(3),m2 c(3))
insert into b1 values ("ab","bb")
insert into b1 values ("a","b")
insert into b1 values ("bb","a")
insert into b1 values ("","bb")
insert into b1 values ("bc","")
insert into b1 values ("c","ab")


如何统计一列的全部字符,如M1列含有“abc” 字符,M2列有"ab"字符,用什么方法较好?
谢谢!

[此贴子已经被作者于2021-7-26 14:21编辑过]

15 回复
#2
sdta2021-07-26 15:28
在你以前发的帖子中有查找字符的方法
#3
fdqzy2021-07-26 15:54
以下是引用sdta在2021-7-26 15:28:29的发言:

在你以前发的帖子中有查找字符的方法

本人愚昧,在您回复的帖子中,是针对一个字段值中查找的方法,在对一列中所有字符找出不重复的全部字符,真还没想到好的方法。
#4
fdqzy2021-07-26 16:05
程序代码:
aa = ""
LOCATE FOR 'a'$m1
IF !EOF()
aa=aa+'a'
ENDIF
LOCATE FOR 'b'$m1
IF !EOF()
aa=aa+'b'
ENDIF
LOCATE FOR 'c'$m1
IF !EOF()
aa=aa+'c'
ENDIF
? aa

这个方法太笨了点,有其他好方法吗?
#5
吹水佬2021-07-26 16:06
“在对一列中所有字符找出不重复的全部字符”
具体点,对下面的数据想要的结果是什么?
create cursor b1 (m1 c(3),m2 c(3))
insert into b1 values ("ab","bb")
insert into b1 values ("a","b")
insert into b1 values ("bb","a")
insert into b1 values ("","bb")
insert into b1 values ("bc","")
insert into b1 values ("c","ab")
#6
吹水佬2021-07-26 16:10
以下是引用fdqzy在2021-7-26 16:05:11的发言:

aa = ""
LOCATE FOR 'a'$m1
IF !EOF()
aa=aa+'a'
ENDIF
LOCATE FOR 'b'$m1
IF !EOF()
aa=aa+'b'
ENDIF
LOCATE FOR 'c'$m1
IF !EOF()
aa=aa+'c'
ENDIF
? aa
这个方法太笨了点,有其他好方法吗?

每个LOCATE 只找一个记录
#7
fdqzy2021-07-26 16:22
回复 6楼 吹水佬
我只需要一列所有字符中,不同字符只列出一个就行,即这列中到底含哪几个不同字符。
如m1列含有“abc”,m2列含有"ab".

[此贴子已经被作者于2021-7-26 16:25编辑过]

#8
吹水佬2021-07-26 16:34
以下是引用fdqzy在2021-7-26 16:22:35的发言:

我只需要一列所有字符中,不同字符只列出一个就行,即这列中到底含哪几个不同字符。
如m1列含有“abc”,m2列含有"ab".

create cursor b1 (m1 c(3),m2 c(3))
insert into b1 values ("ab","bb")
insert into b1 values ("ax","b")
insert into b1 values ("bb","a")
insert into b1 values ("z","bb")
insert into b1 values ("bc","")
insert into b1 values ("cy","ab")
是不是这意思
m1列的结果:abcxyz
#9
sdta2021-07-26 16:42
程序代码:
create cursor b1 (m1 c(3),m2 c(3))
insert into b1 values ("ab","bb")
insert into b1 values ("a","b")
insert into b1 values ("bb","a")
insert into b1 values ("","bb")
insert into b1 values ("bc","")
insert into b1 values ("c","ab")
LOCAL aa[FCOUNT()]
aa = ""
SCAN
    FOR lnj = 1 TO FCOUNT()
        b1 = ALLTRIM(EVALUATE(FIELD(lnj)))
        IF LEN(b1) > 0
            FOR lnk = 1 TO LEN(b1)
                b2 = SUBSTR(b1, lnk, 1)
                IF NOT b2$aa[lnj]
                    aa[lnj] = aa[lnj] + b2
                ENDIF
            ENDFOR
        ENDIF
    ENDFOR
ENDSCAN
LIST MEMORY LIKE aa
#10
fdqzy2021-07-26 17:08
以下是引用吹水佬在2021-7-26 16:34:44的发言:


create cursor b1 (m1 c(3),m2 c(3))
insert into b1 values ("ab","bb")
insert into b1 values ("ax","b")
insert into b1 values ("bb","a")
insert into b1 values ("z","bb")
insert into b1 values ("bc","")
insert into b1 values ("cy","ab")
是不是这意思
m1列的结果:abcxyz

对!
#11
fdqzy2021-07-26 17:09
以下是引用sdta在2021-7-26 16:42:18的发言:

create cursor b1 (m1 c(3),m2 c(3))
insert into b1 values ("ab","bb")
insert into b1 values ("a","b")
insert into b1 values ("bb","a")
insert into b1 values ("","bb")
insert into b1 values ("bc","")
insert into b1 values ("c","ab")
LOCAL aa[FCOUNT()]
aa = ""
SCAN
    FOR lnj = 1 TO FCOUNT()
        b1 = ALLTRIM(EVALUATE(FIELD(lnj)))
        IF LEN(b1) > 0
            FOR lnk = 1 TO LEN(b1)
                b2 = SUBSTR(b1, lnk, 1)
                IF NOT b2$aa[lnj]
                    aa[lnj] = aa[lnj] + b2
                ENDIF
            ENDFOR
        ENDIF
    ENDFOR
ENDSCAN
LIST MEMORY LIKE aa

谢谢!
    好像版主是统计的所有列,不是单列m1列或m2列?

[此贴子已经被作者于2021-7-26 17:17编辑过]

#12
sdta2021-07-26 18:05
以下是引用fdqzy在2021-7-26 17:09:08的发言:


谢谢!
    好像版主是统计的所有列,不是单列m1列或m2列?

#13
fdqzy2021-07-26 18:26
回复 12楼 sdta
是我看错了,谢谢!
#14
吹水佬2021-07-27 11:41
如果字符相对固定(假设数据只是小写字母),算法可以简化一下(减法):
程序代码:
create cursor b1 (m1 c(3),m2 c(3))
insert into b1 values ("ab","bb")
insert into b1 values ("ax","b")
insert into b1 values ("bb","a")
insert into b1 values ("z","bb")
insert into b1 values ("bc","")
insert into b1 values ("cy","ab")
cs = "abcdefghijklmnopqrstuvwxyz"
? "m1:", fun("m1")
? "m2:", fun("m2")
RETURN

FUNCTION fun(cf)
    s = cs
    SCAN
        s  = CHRTRAN(s,ALLTRIM(EVALUATE(cf)),"")
    ENDSCAN
    RETURN CHRTRAN(cs,s,"")
ENDFUNC

#15
fdqzy2021-07-27 14:30
以下是引用吹水佬在2021-7-27 11:41:59的发言:

如果字符相对固定(假设数据只是小写字母),算法可以简化一下(减法):
create cursor b1 (m1 c(3),m2 c(3))
insert into b1 values ("ab","bb")
insert into b1 values ("ax","b")
insert into b1 values ("bb","a")
insert into b1 values ("z","bb")
insert into b1 values ("bc","")
insert into b1 values ("cy","ab")
cs = "abcdefghijklmnopqrstuvwxyz"
? "m1:", fun("m1")
? "m2:", fun("m2")
RETURN

FUNCTION fun(cf)
    s = cs
    SCAN
        s  = CHRTRAN(s,ALLTRIM(EVALUATE(cf)),"")
    ENDSCAN
    RETURN CHRTRAN(cs,s,"")
ENDFUNC

谢谢!
#16
wcx_cc2021-07-29 01:56
每个字符占一条记录,纵向放进一个表里,最后 select .. group by ,不相同的字符不就都出来吗?这个方法还可以用到汉字上。但不知是否是要这样的结果。
1