R_Language 板


LINE

※ 引述《PILIPALAPON (pilipalapon)》之銘言: : [問題類型]: : 程式諮詢 : [軟體熟悉度]: : 入門 : [問題敘述]: : 資料檔如下 : Addr : 宜蘭縣數學鎮數學里10鄰數學路100巷16之2號 : 基隆市太陽區太陽里17鄰太陽三街223之2號十九樓 : 基隆市白雲區白雲里20鄰白雲三街59號十樓之1 : 新竹市海洋區海洋里13鄰海洋路29號六樓 : 臺北市小明區小名里20鄰小名路222號二十樓 : 新北市語文區語文里17鄰語文路221號二十九樓之5 : 宜蘭縣飛機鎮飛機里3鄰飛機路73號 : 新北市紅色區紅色里15鄰紅色路四段15號之4十七樓 : 若「樓」前面有國字數字,需先轉成數字,再將每一個住址裡的數字全部抓出來。 : 這個問題除了中文數字外,還需要處理全型的數字(已問過原PO,後面確實是全型數字) 我這裡的順序是先處理全型的數字,才處理中文數字 當然也可以反過來,兩個不影響 好讀版:http://pastebin.com/srDz11gP 全型轉成半型的想法是這樣: 先行知識:字串可以轉成raw bytes的型式,多個16進位的數字表示 你可以試試看 charToRaw("123") 會出現 [1] 31 32 33 charToRaw("123") 會出現 [1] a2 b0 a2 b1 a2 b2 所以全形數字會佔去兩個16進位,可以稍微測試一下: charToRaw("0123456789") [1] a2 af a2 b0 a2 b1 a2 b2 a2 b3 a2 b4 a2 b5 a2 b6 a2 b7 a2 b8 可以看到全型的0123456789 開頭都是 a2 而結尾是af到b8 把af到b8轉成數字就是 175~184 因此,先把a2找出來,再將確定後一位是否為175~184 (全形數字) 之後再把第二個數字做位移(減去127),然後把第一個數字去掉 這樣轉換就完成了 PS: 減去127的原因是 as.integer(charToRaw("0"))是 48 as.integer(charToRaw("0")[2])是 175 兩個相差的值是127... 至於中文數字轉阿拉伯數字則是參考這篇的python code: http://www.cnblogs.com/kaituorensheng/p/3586942.html address <- c("宜蘭縣數學鎮數學里10鄰數學路100巷16之2號", "基隆市太陽區太陽里17鄰太陽三街223之2號十九樓", "基隆市白雲區白雲里20鄰白雲三街59號十樓之1", "新竹市海洋區海洋里13鄰海洋路29號六樓", "臺北市小明區小名里20鄰小名路222號二十樓", "新北市語文區語文里17鄰語文路221號二十九樓之5", "宜蘭縣飛機鎮飛機里3鄰飛機路73號", "新北市紅色區紅色里15鄰紅色路四段15號之4十七樓") library(magrittr) library(plyr) library(stringr) library(stringi) address_converted <- sapply(address, function(x){ raw_address <- charToRaw(x) loc_maybe_fullwidth_digits <- which(raw_address == "a2") second_loc <- raw_address[loc_maybe_fullwidth_digits+1] %>% as.integer loc_fullwidth_digits <- loc_maybe_fullwidth_digits[second_loc >= 175 & second_loc <= 184] + 1 raw_address[loc_fullwidth_digits] <- raw_address[loc_fullwidth_digits] %>% as.integer %>% '-'(127) %>% as.raw return(rawToChar(raw_address[setdiff(1:length(raw_address), loc_fullwidth_digits-1)])) }) %>% `names<-`(NULL) # [1] "宜蘭縣數學鎮數學里10鄰數學路100巷16之2號" # [2] "基隆市太陽區太陽里17鄰太陽三街223之2號十九樓" # [3] "基隆市白雲區白雲里20鄰白雲三街59號十樓之1" # [4] "新竹市海洋區海洋里13鄰海洋路29號六樓" # [5] "臺北市小明區小名里20鄰小名路222號二十樓" # [6] "新北市語文區語文里17鄰語文路221號二十九樓之5" # [7] "宜蘭縣飛機鎮飛機里3鄰飛機路73號" # [8] "新北市紅色區紅色里15鄰紅色路四段15號之4十七樓" chinese2digits <- function(x){ vals <- sapply(str_split(x, "")[[1]], function(chi_digit){ mapvalues(chi_digit, c("零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "百", "千", "萬", "億"), c(0:10, 10^c(2,3,4,8)), FALSE) }) %>% as.integer digit_output <- 0 base_term <- 1 for (i in rev(seq_along(vals))) { if (vals[i] >= 10 && i == 1) { base_term <- ifelse(vals[i] > base_term, vals[i], base_term * vals[i]) digit_output <- digit_output + vals[i] } else if (vals[i] >= 10) { base_term <- ifelse(vals[i] > base_term, vals[i], base_term * vals[i]) } else { digit_output <- digit_output + base_term * vals[i] } } return(digit_output) } ## test # chinese2digits("一百五十二") # 152 # chinese2digits("一億零八萬零三百二十三") # 100080323 # chinese2digits("十九") # 19 address_converted2 <- sapply(address_converted, function(x){ pattern_starts <- "[零一二三四五六七八九十百千萬億]+樓" if (!str_detect(x, pattern_starts)) return(x) stairs <- str_extract(x, pattern_starts) x <- str_replace(x, str_c("(\\d+)(", pattern_starts, ")"), "\\1, \\2") x <- str_replace(stairs, "樓", "") %>% chinese2digits %>% str_c("樓") %>% {str_replace(x, stairs, .)} return(x) }) %>% `names<-`(NULL) # [1] "宜蘭縣數學鎮數學里10鄰數學路100巷16之2號" # [2] "基隆市太陽區太陽里17鄰太陽三街223之2號19樓" # [3] "基隆市白雲區白雲里20鄰白雲三街59號10樓之1, " # [4] "新竹市海洋區海洋里13鄰海洋路29號6樓" # [5] "臺北市小明區小名里20鄰小名路222號20樓" # [6] "新北市語文區語文里17鄰語文路221號29樓之5, " # [7] "宜蘭縣飛機鎮飛機里3鄰飛機路73號" # [8] "新北市紅色區紅色里15鄰紅色路四段15號之4, 17樓" sapply(address_converted2, str_extract_all, pattern = "\\d+") # $`宜蘭縣數學鎮數學里10鄰數學路100巷16之2號` # [1] "10" "100" "16" "2" # # $基隆市太陽區太陽里17鄰太陽三街223之2號19樓 # [1] "17" "223" "2" "19" # # $`基隆市白雲區白雲里20鄰白雲三街59號10樓之1, ` # [1] "20" "59" "10" "1" # # $新竹市海洋區海洋里13鄰海洋路29號6樓 # [1] "13" "29" "6" # # $臺北市小明區小名里20鄰小名路222號20樓 # [1] "20" "222" "20" # # $`新北市語文區語文里17鄰語文路221號29樓之5, ` # [1] "17" "221" "29" "5" # # $宜蘭縣飛機鎮飛機里3鄰飛機路73號 # [1] "3" "73" # # $`新北市紅色區紅色里15鄰紅色路四段15號之4, 17樓` # [1] "15" "15" "4" "17" -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) http://tinyurl.com/j3ql84c data.table #1LhW7Tvj (R_Language) http://tinyurl.com/hr77hrn dplyr(上) #1LhpJCfB (R_Language) http://tinyurl.com/jtg4hau dplyr(下) #1Lhw8b-s (R_Language) tidyr #1Liqls1R (R_Language) http://tinyurl.com/jq3o2g3 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.76.63.212
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1466006460.A.4DC.html
1F:推 PILIPALAPON: 感謝~~ 06/16 01:45
※ 編輯: celestialgod (140.109.74.87), 06/16/2016 09:55:31
2F:推 fish0331: 推一個,但數字中文轉換還是有限制,比如沒有「億」以上 08/20 13:30
3F:→ fish0331: 的對應轉換,以及數字太大在電腦中計算產生溢位的疑慮。 08/20 13:30
4F:→ fish0331: 不知道後來有沒有更新的手法。另外函式chinese2digits 08/20 13:30
5F:→ fish0331: 中for裡的第一個if,有一點小錯誤,應該是digit_output 08/20 13:30
6F:→ fish0331: <-digit_output + base_term。可以用十二萬零一百做測 08/20 13:30
7F:→ fish0331: 試:) 08/20 13:30







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP