楼主: chizichao
4357 11

求助一个利用SQL检索和赋值的程序问题 [推广有奖]

  • 0关注
  • 1粉丝

教授

39%

还不是VIP/贵宾

-

威望
0
论坛币
8888 个
通用积分
99.0479
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1243 点
帖子
39
精华
0
在线时间
2708 小时
注册时间
2008-8-3
最后登录
2025-12-26

楼主
chizichao 发表于 2014-1-5 23:25:04 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
各位大大好,最近使用SAS处理数据时,遇到了一个问题,自己花了很多时间在网上搜找,但仍然不得要领。问题是这样的:

1、我现在有一个数据表TableA,其中有一个变量Info,每一行里面包含了大量的文字信息。
2、此外,我还有一个数据表TableB,里面只有一个变量叫做Keyword,每一行都是一些中文的单词。
3、我现在想做的就是:在TableA中创建一个新变量dummy,然后对每一行的Info进行检索,如果Info内容里面包含有Keyword变量里任意一行的中文单词,就对这一行的dummy赋值为1。如果完全不含有任何一个关键词,则赋值为0.

TableA:(实际的Info内容要比下面的这些长得多,大多数都至少有20字以上)
     Info          其他变量1     其他变量2 ...
蛋糕点心甜        XXX                XXX
喜欢理发           XXX                XXX
点心师傅           XXX                XXX
做蛋糕的           XXX                XXX
     ...                  ...                   ...

TableB:(Keyword里每行本身比较短,一般不超过5个字的,但keyword行数很多)
   Keyword
     蛋糕
     点心
       ...

希望最后得到的表:
     Info          其他变量1     其他变量2 ...    dummy
蛋糕点心甜        XXX                XXX                  1
喜欢理发           XXX                XXX                   0
点心师傅           XXX                XXX                   1
做蛋糕的           XXX                XXX                   1
     ...                  ...                   ...                     ...

我知道如果keyword只是几个词的话,可以用 where Info contains "XXX" 作条件来挨个赋值,但是现在keyword十分多,我就不知道该怎么办了。我的朋友和我说要使用“游标”,但我搜索了半天,也没找到怎么做。
希望有大大能有Proc SQL下的方式能帮我解决这一难题。

另外,我知道直接在data步下,可以用 set if find(info, "XXX") then dummy=1 来挨个赋值,但是对于keyword很多的时候我又不知道怎么办了,如果有大大还能从data步的角度帮助解决一下就更好啦~ (p.s 希望优先SQL的角度解决,因为导师要求全部使用SQL步来处理...)

多谢各位大大!!!跪谢!!!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sql proc sql keyword Contain SAS处理数据 关键词 数据表 中文 程序 单词

本帖被以下文库推荐

沙发
zhengbo8 发表于 2014-1-5 23:29:15
研究一下。

藤椅
chizichao 发表于 2014-1-5 23:35:07
我的朋友使用其他的SQL软件帮我编写了一段代码,可以完成这个工作。但是问题是他使用的涉及到游标部分的程序,我完全不知道该怎么转化为SAS里面的SQL语言...
他的编写程序是:
DECLARE @keyword varchar(255)
DECLARE KEYWORDS CURSOR --定义游标
FOR (SELECT keyword FROM keywordTable) --从keywordTable中查出keyword放到游标中
OPEN KEYWORDS; --打开游标
FETCH NEXT FROM KEYWORDS INTO @keyword; --读取第一行数据
WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT @keyword; --打印数据(调试用,正式使用时删除)
        UPDATE tableA SET dummy = 1 WHERE biography like '%'+@keyword+'%'; --更新数据(tableA是需要更新状态的表)
        FETCH NEXT FROM KEYWORDS INTO @keyword; --读取下一行数据
    END
CLOSE KEYWORDS; --关闭游标
DEALLOCATE KEYWORDS; --释放游标
GO

望着这一段程序泪流满面...研究了好些日子,还是搞不定,只能上来求助大家了。
其实我觉得我这个问题在数据处理时还是蛮典型的。求帮助!

板凳
zw612003 发表于 2014-1-5 23:35:40 来自手机
我也遇到过类似的问题,要写一堆的like

报纸
zhengbo8 发表于 2014-1-5 23:51:10
数据集可以传上来吗?附件。

地板
zhengbo8 发表于 2014-1-6 01:07:44
SQL方法:

我研究了下,提供一个实例。
  1. data a;
  2.         input info $ 50.;
  3. datalines;
  4. 蛋糕点心甜糕的理发糕蛋糕蛋糕蛋糕蛋糕蛋糕蛋糕        
  5. 喜欢理发糕的理发糕蛋糕蛋糕         
  6. 点心师傅糕的理完全不含有任何一个关键词蛋糕           
  7.       
  8. ;

  9. data b;
  10.         input keyword $ 4.;
  11. datalines;
  12. 蛋糕
  13. 点心
  14. 喜欢
  15. 理发
  16. ;

  17. proc sql;

  18.         create table c as select info,count(*) as dummy
  19.         from (
  20.                 select a.info,b.keyword
  21.                         from a cross join b
  22.         )
  23.         where  info contains keyword
  24.         group by info;

  25. quit;
复制代码



如果info每个值不是唯一的,在group by时,就要把其它变量加上。


data步方法:

目前,想到的是hash表实现,明天写啦,太晚了。

已有 1 人评分论坛币 收起 理由
admin_kefu + 100 热心帮助其他会员

总评分: 论坛币 + 100   查看全部评分

7
playmore 发表于 2014-1-6 09:36:36
zhengbo8 发表于 2014-1-6 01:07
SQL方法:

我研究了下,提供一个实例。
我只用过Hash表对关键词整体匹配
这种在字符串变量中查找匹配的子串,不知道还能用Hash吗?
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

8
yongyitian 发表于 2014-1-6 09:45:23
playmore 发表于 2014-1-6 09:36
我只用过Hash表对关键词整体匹配
这种在字符串变量中查找匹配的子串,不知道还能用Hash吗?
这有一个例子

[疑难解惑] 如何从一个表,模糊匹配另一个表中的字段
https://bbs.pinggu.org/forum.php? ... =2809637&page=1

9
playmore 发表于 2014-1-6 10:12:26
yongyitian 发表于 2014-1-6 09:45
这有一个例子

[疑难解惑] 如何从一个表,模糊匹配另一个表中的字段
多谢
我刚才学习了下Hash的Iterator对象,还想请教个问题:
这个模糊匹配的问题如果要用Hash来解决,好像只能这样用Hash的迭代,然后每次调用下Find函数来匹配?
我知道用Hash对象会比用Proc Sql快一些,但是每次都要调用这个Find函数会不会拖慢速度

如果有一个直接的方法,比如h.FuzzyFind()这样的就好了,只要目标字符串里含有需要匹配的字符串,就算匹配成功
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

10
yongyitian 发表于 2014-1-6 10:43:00
playmore 发表于 2014-1-6 10:12
多谢
我刚才学习了下Hash的Iterator对象,还想请教个问题:
这个模糊匹配的问题如果要用Hash来解决,好 ...
很好的想法, 但我用的是sas9.1,里面只有几个最基本的函数, 如h.add(), h.replace(), h.find(), 和iterator 的 hi.first(), hi.last(), hi.next(), hi.prev()等. sas9.2以后的版本增加了许多hash函数。 不知是否有h.FuzzyFind()这样的函数.

每一条观测都查一遍 lookup table 肯定会影响效率。 没有用iterator时,find()函数也要查一遍lookup table。 估计用iterator后, 计算量会增加一倍以上。
一般情况下,hash里的lookup表,应该是一个较小的表。很大的hash表会增加内存的占用,从而影响运算速度。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 15:09