SAS中文论坛

标题: 如何把全角转换为半角字符 [打印本页]

作者: shiyiming    时间: 2007-11-6 10:43
标题: 如何把全角转换为半角字符
高手有问题请教,

有几万条记录在手里,某个字段string里面有全角的字符(某些又没有),比如:
上海市遵义路100号虹桥上海城 B栋805-10室
PARK HEUNG RYUL      

有什么方法转换成正常的字符,比如PARK HEUNG RYUL.
多谢了。
作者: shiyiming    时间: 2007-11-6 14:28
标题: Re: 如何把全角转换为半角字符
我个人认为应该是没有现成的SAS函数支持全角字符与半角字符的方便转换,但是Java在这方面就强多了,是否可以考虑采用Java代码帮忙。

步骤1:编写Java代码Change.java实现全角与半角的转换;用javac命令编译成class文件,放在任意目录下,如C:\Change.class。
[code:3trzh66w]public class Change {

        public String DBCString;

        public String SBCString;

        public String getDBCString() {
                return DBCString;
        }

        public void setDBCString(String string) {
                DBCString = string;
        }

        public Change(String inStr) {
                this.setSBCString(this.ToSBC(inStr));
                this.setDBCString(this.ToDBC(inStr));
        }

        public String getSBCString() {
                return SBCString;
        }

        public void setSBCString(String string) {
                SBCString = string;
        }

        public static String ToSBC(String input) {
                // 半角转全角
                char[] c = input.toCharArray();
                for (int i = 0; i < c.length; i++) {
                        if (c[i] == 32) {
                                c[i] = (char) 12288;
                                continue;
                        }
                        if (c[i] < 127)
                                c[i] = (char) (c[i] + 65248);
                }
                return new String(c);
        }

        public static String ToDBC(String input) {
                // 全角转半角
                char[] c = input.toCharArray();
                for (int i = 0; i < c.length; i++) {
                        if (c[i] == 12288) {
                                c[i] = (char) 32;
                                continue;
                        }
                        if (c[i] > 65280 && c[i] < 65375)
                                c[i] = (char) (c[i] - 65248);
                }
                return new String(c);
        }

}[/code:3trzh66w]
步骤2:修改SAS安装目录下的SASV9.cfg文件,根据class文件的物理路径修改或增加-Dsas.app.class.path=C:\。
[quote:3trzh66w]/*  Options used when SAS is accessing a JVM for JNI processing  */
-JREOPTIONS=(-Dsas.jre.home=...... -Dsas.app.class.path=C:\)
[/quote:3trzh66w]
步骤3:编写SAS代码调用Java程序。
[code:3trzh66w]data test;
length DBC $200;
length SBC $200;
declare javaobj j ('Change', '上海市s遵 义路100号虹 桥上海t1城 B栋805-10室 PARK HEUNG RYUL');
j.callStringMethod ('getDBCString', DBC);
j.callStringMethod ('getSBCString', SBC);
j.delete();
run;[/code:3trzh66w]

以上方法我已经是完全实现做通了,其它思路:
1、用macro和tranwrd函数实现,如tranwrd('PARK', 'P', 'P')。
2、全角空格为12288,半角空格为32;其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248。用SAS中的byte函数实现。
其他方法我还没有尝试过,有兴趣的朋友可以尝试一下,大家再来一起探讨。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2