Извлекать буквы и цифры из строки - PullRequest
1 голос
/ 12 мая 2019

У меня есть следующие строки:

KZ1,345,769.1
PKS948,123.9   
XG829,823.5 
324JKL,282.7
456MJB87,006.01

Как разделить буквы и цифры?

Это результат, который я ожидаю:

  KZ   1345769.1  
 PKS    948123.9  
  XG    829823.5  
 JKL    324282.7  
 MJB    45687006  

Я пытался использовать для этой цели команду split, но безуспешно.

Ответы [ 2 ]

2 голосов
/ 12 мая 2019

То, что вы хотите, может быть достигнуто с помощью простого регулярного выражения:

clear

input str15 foo
"KZ1,345,769.1"
"PKS948,123.9"   
"XG829,823.5" 
"324JKL,282.7"
"456MJB87,006.01"
end

generate foo1 = subinstr(ustrregexra(foo, "[\d\.]", ""), ",", "", .)
generate double foo2 = real(ustrregexra(foo, "[^\d\.]", ""))

list

     +------------------------------------+
     |             foo   foo1        foo2 |
     |------------------------------------|
  1. |   KZ1,345,769.1     KZ   1345769.1 |
  2. |    PKS948,123.9    PKS    948123.9 |
  3. |     XG829,823.5     XG    829823.5 |
  4. |    324JKL,282.7    JKL    324282.7 |
  5. | 456MJB87,006.01    MJB    45687006 |
     +------------------------------------+

Набрав help subinstr(), help ustrregexra() и help real() из командной строки Stata, вы получите более подробную информацию об использовании исинтаксис этих функций.

1 голос
/ 13 мая 2019

@ Ответ Пёрли Спенсер, безусловно, предпочтительнее, но любой программист должен иметь дело со следующим наивным циклом. Посмотрите на каждого персонажа по очереди и решите, является ли он буквой; или число или десятичная точка; или что-то еще (неявно) и строить ответы таким образом. Обратите внимание, что, хотя мы зацикливаемся на длине строки, зацикливание на наблюдениях тоже является молчаливым.

clear 
input str42 whatever 
"KZ1,345,769.1"
"PKS948,123.9"   
"XG829,823.5" 
"324JKL,282.7"
"456MJB87,006.01"
end 

compress 

local length = substr("`: type whatever'", 4, .) 

gen letters = "" 
gen numbers = "" 

quietly forval j = 1/`length' { 
    local arg substr(whatever,`j', 1) 
    replace letters = letters + `arg' if inrange(`arg', "A", "Z") 
    replace numbers = numbers + `arg' if `arg' == "." | inrange(`arg', "0", "9") 
}

list 


     +-----------------------------------------+
     |        whatever   letters       numbers |
     |-----------------------------------------|
  1. |   KZ1,345,769.1        KZ     1345769.1 |
  2. |    PKS948,123.9       PKS      948123.9 |
  3. |     XG829,823.5        XG      829823.5 |
  4. |    324JKL,282.7       JKL      324282.7 |
  5. | 456MJB87,006.01       MJB   45687006.01 |
     +-----------------------------------------+
...