楼主: 小鳄鱼a
3161 18

请高手修正一个程序 [推广有奖]

11
小鳄鱼a 发表于 2015-12-28 10:18:57 |只看作者 |坛友微信交流群
Tigflanker 发表于 2015-12-28 08:40
length RHTPFT_Hanzi 2RHTPFTPinyin6;

显然是你把上面这句直接copy过去了,咱们论坛的code编辑器有问题, ...
谢谢   试了一下还是不行呢

使用道具

12
Tigflanker 发表于 2015-12-28 10:39:04 |只看作者 |坛友微信交流群
length RHTPFT_Hanzi ¥2 RHTPFT_Pinyin ¥6;

把上面的人民币换成美元,再试试

我要吐槽你了,你在用别人的宏时,需要把里面的内容读个差不多的,
像hash这个,万一内存不足什么的,你需要想想怎么用back up的一些实现方法

使用道具

13
小鳄鱼a 发表于 2015-12-28 13:12:23 |只看作者 |坛友微信交流群
Tigflanker 发表于 2015-12-28 10:39
length RHTPFT_Hanzi ¥2 RHTPFT_Pinyin ¥6;

把上面的人民币换成美元,再试试
谢谢    主要是最近时间有点赶    我还做着其他事情   能看得懂   只是一些具体的写法不大清楚     不好意思   这个也不行   

使用道具

14
Tigflanker 发表于 2015-12-28 13:46:38 |只看作者 |坛友微信交流群
小鳄鱼a 发表于 2015-12-28 13:12
谢谢    主要是最近时间有点赶    我还做着其他事情   能看得懂   只是一些具体的写法不大清楚     不好意 ...


有空的时候,我也拿来跑一下,不过只是看你的提示,意思就是hash定义那块的问题

不如你@一下playmore本人,他有空的话,应该也会给你答的

使用道具

15
孤单的我们 发表于 2015-12-28 13:51:32 |只看作者 |坛友微信交流群
  1. data TEST;
  2. input name $;
  3. cards;
  4. 张三
  5. 李四
  6. 王五
  7. ;
  8. run;
  9. %macro TransHanziToPinyinForTable(SourceTable,TargetTable,InputVar,OutputVar,Delimiter);
  10. /**********************************************************************/
  11. /* 此宏用于将指定变量中的汉字转换为对应的拼音。其中,SourceTable是原  */
  12. /* 始表格;TargetTable是结果表格;InputVar是需要转换的目标变量,仅能  */
  13. /* 设置一个,可包含除汉字外的英文字母、数字和其他字符;OutputVar是转  */
  14. /* 换得到的结果变量;Delimiter是用来分隔拼音的分隔符,若不需要分隔可  */
  15. /* 设为空。注意,Delimiter的设置如下,注意需要加引号:                */
  16. /*     逗号分隔    delimiter = ','                                   */
  17. /*   空隔分隔    delimiter = ' '                                   */
  18. /*      下划线分隔  delimiter = '_'                                   */
  19. /*                                                                    */
  20. /* 最终指定变量中的汉字转换为对应的拼音,并保存至结果表格中。         */
  21. /*                                                                    */
  22. /*                                      Created on 2014.2.27          */
  23. /*                                      Modified on 2014.2.27         */
  24. /**********************************************************************/
  25. /* 第一步:导入汉字拼音对照表 */
  26. proc import datafile="F:\GB2312汉字拼音对照表(6727字).txt"
  27. out=RHTPFT_HanziToPinyin
  28. dbms=dlm
  29. replace;
  30. guessingrows=2000;
  31. delimiter=' ';
  32. getnames=No;
  33. run;
  34. data RHTPFT_HanziToPinyin;
  35. set RHTPFT_HanziToPinyin;
  36. rename VAR1=RHTPFT_Hanzi;
  37. rename VAR2=RHTPFT_Pinyin;
  38. drop VAR3 VAR4 VAR5;
  39. run;
  40. /* 第二步:得到输入变量的长度,由此计算出输出变量的长度 */
  41. proc contents data=&SourceTable out=RHTPFT_VarList noprint;
  42. run;
  43. proc sql noprint;
  44. select LENGTH*5 into :RHTPFT_LengthOfInputVar
  45.   from RHTPFT_VarList
  46.    where UPCASE(NAME) EQ %UPCASE("&InputVar");
  47. quit;
  48. /* 第三步:将汉字文件名转为拼音 */
  49. data &TargetTable(drop=RHTPFT_Hanzi RHTPFT_Pinyin RHTPFT_i);
  50. length RHTPFT_Hanzi RHTPFTPinyin2 RHTPFT_Pinyin $20;
  51. if _N_ EQ 1 then do;
  52.   declare hash h(dataset: 'RHTPFT_HanziToPinyin');
  53.   h.defineKey('RHTPFT_Hanzi');
  54.   h.defineData('RHTPFT_Pinyin');
  55.   h.defineDone();
  56. end;
  57. set &SourceTable;
  58. length &OutputVar $&RHTPFT_LengthOfInputVar..;
  59. do RHTPFT_i=1 to KLENGTH(&InputVar);
  60.   RHTPFT_Hanzi=KSUBSTR(&InputVar,RHTPFT_i,1);
  61.   %if &Delimiter EQ %STR() %then %do;
  62.    if h.find() EQ 0 then &OutputVar.=CATS(&OutputVar,RHTPFT_Pinyin);
  63.    else &OutputVar.=CATS(&OutputVar,RHTPFT_Hanzi);
  64.   %end;
  65.   %else %do;
  66.    if h.find() EQ 0 then &OutputVar.=CATX(&Delimiter,&OutputVar,RHTPFT_Pinyin);
  67.    else &OutputVar.=CATS(&OutputVar,RHTPFT_Hanzi);
  68.   %end;
  69. end;
  70. run;
  71. /* 删除不必要的表格 */
  72. proc datasets lib=work nolist;
  73.     delete RHTPFT_:;
  74. quit;
  75. %mend;

  76. %macro Demo();
  77. %let SourceTable=TEST;
  78. %let TargetTable=WANT;
  79. %let InputVar=name;
  80. %let OutputVar=Fund_Name_Pinyin;
  81. %let Delimiter=' ';
  82. %TransHanziToPinyinForTable(&SourceTable,&TargetTable,&InputVar,&OutputVar,&Delimiter);
  83. %mend;

  84. %Demo;
复制代码


第三步里,length RHTPFT_Hanzi RHTPFTPinyin2 RHTPFT_Pinyin $20;进行了修改。
能运行出来,有2个未初始化的note.

使用道具

16
小鳄鱼a 发表于 2015-12-28 16:35:49 |只看作者 |坛友微信交流群
孤单的我们 发表于 2015-12-28 13:51
第三步里,length RHTPFT_Hanzi RHTPFTPinyin2 RHTPFT_Pinyin $20;进行了修改。
能运行出来,有2个未初 ...
谢谢    我看运行出来的结果是  小写   。
我的格式包括 小写  开头大写   姓大写   全拼大写  Zhang san  ZHANF SAN  Zhang San  zhang san 。并且中间的空格个数也不一样   这样的话怎样标准化为统一的格式呢   。比如都是  Zhang San   或者  zhang san ,中间间隔一个空格

使用道具

17
小鳄鱼a 发表于 2015-12-28 16:37:31 |只看作者 |坛友微信交流群
孤单的我们 发表于 2015-12-28 13:51
第三步里,length RHTPFT_Hanzi RHTPFTPinyin2 RHTPFT_Pinyin $20;进行了修改。
能运行出来,有2个未初 ...
谢谢    我看运行出来的结果是  小写   。
我的格式包括 小写  开头大写   姓大写   全拼大写  Zhang san  ZHANF SAN  Zhang San  zhang san 。并且中间的空格个数也不一样   这样的话怎样标准化为统一的格式呢   。比如都是  Zhang San   或者  zhang san ,中间间隔一个空格

使用道具

18
小鳄鱼a 发表于 2015-12-28 22:28:36 |只看作者 |坛友微信交流群
孤单的我们 发表于 2015-12-28 13:51
第三步里,length RHTPFT_Hanzi RHTPFTPinyin2 RHTPFT_Pinyin $20;进行了修改。
能运行出来,有2个未初 ...
未初始化的note   是什么原因导致的呢

使用道具

19
孤单的我们 发表于 2015-12-29 09:33:26 |只看作者 |坛友微信交流群
未初始化原因:
1、length语句多定义了变量RHTPFTPinyin2;
2、if h.find() EQ 0 then &OutputVar.=CATX(&Delimiter,&OutputVar,RHTPFT_Pinyin);该语句执行时,RHTPFT_Pinyin未初始化

第三步第二行删除,改为
length RHTPFT_Hanzi RHTPFT_Pinyin $5;*拼音的最大长度应该是5;
retain RHTPFT_Hanzi RHTPFT_Pinyin '';*新增retain语句,防止未初始化;

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-24 09:51