注册 登录
编程论坛 VFP论坛

姓名按要求过滤问题

dbf永动机 发布于 2023-09-04 13:43, 798 次点击
现有一个dbf文件名为xingming
其中有两列xm1,xm2
张三丰    张三
李四     王五
小丽     小莉
张子默   张了黑
高强     高强
。。。   。。。

需要达到的效果的是找到两列完全不同的姓名行,只要两列有一个字等于(也不考虑汉字位置)就过滤掉,只要完全完全不相等信息,比如以上例子返回:
李四   王五


请问如果写一个prg生成一个查询结果表。
16 回复
#2
csyx2023-09-04 14:23
myfll 里有个叫 StrApproach 的计算相似度函数,用它来判断就很简单

程序代码:
Set Library To myfll
Create Cursor test (xm1 V(10), xm2 V(10))
Insert into test Values ('张三丰', '张三')
Insert into test Values ('李四', '王五')
Insert into test Values ('小丽', '小莉')
Insert into test Values ('张子默', '张了黑')
Insert into test Values ('高强', '高强')
Select * from test where StrApproach(xm1, xm2) = 0
#3
schtg2023-09-04 14:42
回复 楼主 dbf永动机
简单的方法就是进行单个字符判断,请试一试:
程序代码:
create cursor tt (xm1 v(10), xm2 v(10))
insert into tt values ('张三丰', '张三')
insert into tt values ('李四', '王五')
insert into tt values ('小丽', '小莉')
insert into tt values ('张子默', '张了黑')
insert into tt values ('高强', '高强')

select * from tt where !left(alltrim(xm1),2)$alltrim(xm2) and !substr(alltrim(xm1),3,2)$alltrim(xm2) and !substr(alltrim(xm1),5,2)$alltrim(xm2)

若姓名中字符数不太确定的话,可以加上判断最长的姓名字符串。

[此贴子已经被作者于2023-9-4 14:48编辑过]

#4
sdta2023-09-04 18:25
笨方法
程序代码:
CLEAR
create cursor tt (xm1 v(10), xm2 v(10))
insert into tt values ('张三丰', '张三')
insert into tt values ('李四', '王五')
insert into tt values ('小丽', '小莉')
insert into tt values ('张子默', '张了黑')
insert into tt values ('高强', '高强')
SCAN
    lCnt = 0
    FOR ln = 1 TO LENC(ALLTRIM(xm1))
        IF SUBSTRC(ALLTRIM(xm1), ln, 1) $ xm2
            lCnt = lCnt + 1
            EXIT
        ENDIF
    ENDFOR   
    IF lCnt = 0
        ? xm1, xm2
    ENDIF
ENDSCAN
#5
吹水佬2023-09-04 21:52
程序代码:

CLEAR
create cursor tt (xm1 v(10), xm2 v(10))
insert into tt values ('张三丰', '张三')
insert into tt values ('李四', '王五')
insert into tt values ('小丽', '小莉')
insert into tt values ('张子默', '张了黑')
insert into tt values ('高强', '高强')
SELECT * FROM tt WHERE CHRTRANC(xm1,xm2,"")==xm1
#6
dbf永动机2023-09-05 08:41
回复 5楼 吹水佬
太厉害了,没想到一句查询语句就可以实现,不过不我是特别懂这个语句的意思,像是把字段替换成空什么的,能解释一下吗?
#7
sdta2023-09-05 09:46
试试
BROWSE FOR CHRTRANC(xm1,xm2,"")==xm1
#8
吹水佬2023-09-05 10:28
回复 6楼 dbf永动机
在xm1中找到xm2中相同的字时就清除掉,如果最后结果xm1还是原来的样子就是所求。
#9
dbf永动机2023-09-05 13:43
回复 7楼 sdta
这个和吹水佬是一个意思,是可以的
#10
dbf永动机2023-09-05 13:43
回复 8楼 吹水佬
明白了,谢谢
#11
dbf永动机2023-09-08 13:41
回复 5楼 吹水佬
我用3楼和4楼的方法又试了试,他们的方法我在一个几千人的表里都找到39条记录,用你这个方法找到了34条记录,那几条记录也的确应该被找出来,但是目前不知道为什么没有找出来,如果你能发现这其中的逻辑可以告诉我,另外这也是给你一个反馈。
#12
dbf永动机2023-09-08 13:44
回复 4楼 sdta
这个prg,如何加一句代码,让查询结果导出到dbf表格中呢?
#13
z126892023-09-08 14:24
chrtranc( ) 函数
将第一个字符表达式中与第二个表达式的字符相匹配的字符替换为第三个表达式中相应的字符。

吹版强,思维柔软
#14
dbf永动机2023-09-08 14:29
回复 13楼 z12689
不是很懂,麻烦写完整的句子
#15
schtg2023-09-08 18:12
回复 11楼 dbf永动机
可否把应该查询出来,又没有查询出来的那几条记录,展示一下,会更方便发现问题所在,OK
#16
吹水佬2023-09-08 21:17
回复 11楼 dbf永动机
提供些相关数据测试
#17
chychychy2024-08-19 10:33
留个脚印,学习了
1