閱讀739 返回首頁    go 阿裏雲 go 技術社區[雲棲]


MaxCompute UDF係列之全角轉半角

我們在做文本挖掘處理的時候,需要經常把全角字符轉成半角處理今天為大家提供一個全角轉半角的UDF,下載地址見附件。


效果如下:

a9d52a7552c299c8daa44d63f20c51f4b2e61e0f


MaxCompute UDF代碼如下:


package com.yinlin.udf.dev;
import com.aliyun.odps.udf.UDF; 
//import org.apache.commons.lang.StringUtils;
/**
* 提供對字符串的全角->半角,半角->全角轉換
*/
public class BCConvert extends UDF {
/**
* ASCII表中可見字符從!開始,偏移位值為33(Decimal)
*/
static final char DBC_CHAR_START = 33; // 半角!
/**
* ASCII表中可見字符到~結束,偏移位值為126(Decimal)
*/
static final char DBC_CHAR_END = 126; // 半角~
/**
* 全角對應於ASCII表的可見字符從!開始,偏移值為65281
*/
static final char SBC_CHAR_START = 65281; // 全角!
/**
* 全角對應於ASCII表的可見字符到~結束,偏移值為65374
*/
static final char SBC_CHAR_END = 65374; // 全角~
/**
* ASCII表中除空格外的可見字符與對應的全角字符的相對偏移
*/
static final int CONVERT_STEP = 65248; // 全角半角轉換間隔
/**
* 全角空格的值,它沒有遵從與ASCII的相對偏移,必須單獨處理
*/
static final char SBC_SPACE = 12288; // 全角空格 12288
/**
* 半角空格的值,在ASCII中為32(Decimal)
*/
static final char DBC_SPACE = ' '; // 半角空格
/**
* 全角字符->半角字符轉換
* 隻處理全角的空格,全角!到全角~之間的字符,忽略其他
*/
public String evaluate(String src) {
  if (src == null) {return src;}
  StringBuilder buf = new StringBuilder(src.length());
  char[] ca = src.toCharArray();
  for (int i = 0; i < src.length(); i++) {
      if      (ca[i] >= SBC_CHAR_START && ca[i] <= SBC_CHAR_END) 
              {// 如果位於全角!到全角~區間內
               buf.append((char) (ca[i] - CONVERT_STEP));
              }
      else if (ca[i] == SBC_SPACE) 
              {// 如果是全角空格
               buf.append(DBC_SPACE);
              }
      else    { // 不處理全角空格,全角!到全角~區間外的字符
               buf.append(ca[i]);
              }
      }
  return buf.toString();
  }
}


使用方法:

1、通過Eclipse將BCConver.java編譯成Jar包,命名為BCConver.jar。


2、通過大數據開發套件,上傳資源BCConver.jar;


4f31453239189e60089329dd04e2b23a9ab5c16c


3、通過大數據開發套件,引用第二步上傳的BCConver.jar資源,注冊bcconver函數;

b79cd2016b0393ab760517f71d96312daeb66eff

4、通過大數據開發套件新建SQL腳本,輸入SQL函數進行測試。


--創建虛擬表
CREATE TABLE IF NOT EXISTS dual (id STRING);
insert into table dual select '1' from (select count(1) from dual) t;


--提供對字符串的全角->半角
select bcconvert('nihaohk |   nihehe ,。 78  7 ')  from yinlin_demo.dual limit 1;


到此為止,實驗完成。


常見問題

Q:無結果?

我們在創建虛擬dual表的時候,一定要保證表中有數據。


Q:無法找到函數?

利用大數據開發套件注冊函數的時候需要包名+類名,否則會找不到類。



阿裏巴巴大數據-玩家社區 https://yq.aliyun.com/teams/6/

---阿裏大數據博文,問答,社群,實踐,有朋自遠方來,不亦說乎……

bba01b493e1c5d904e882b1c380673c6ebe49a98

最後更新:2017-08-13 22:21:47

  上一篇:go  產品經理與項目經理的區別——匯新雲
  下一篇:go  買新房全款好還是貸款好?先看看各自優劣勢吧