Based on your sample data, you cannot generalize the code from your previous post. This is because the contents of your CTSNo variables do not present a consistent pattern. Thus they require different rules to be applied in order to get what you need from each one.
However, below you can find a simplified toy example of how you can automate the 'expansion' of values when you have multiple CTSNo variables, which are all of the form 156-B/36-57.
Example data:
clear
input int SRNo str200 SchemeName str30 CTSNo3 str15 CTSNo4 str15 CTSNo9
69 "SRA Co-op.Housing Society Ltd." " 156-F/233 - 47" ""
70 "Jai Bhavani CHS Ltd. (Proposed)" "7 (Pt.)" ""
71 "Bhavani Housing" " " "156-B/70 - 89 " ""
72 "Shivshakti SRA CHS Ltd." "364 ‘A’" ""
73 "Shree Ram CHS Ltd. (Prop.)" " " ""
74 "Ram CHS Ltd. (Prop.)" " " " " " 156-D/158 - 69 "
end
list
+---------------------------------------------------------------------------------------------+
| SRNo SchemeName CTSNo3 CTSNo4 CTSNo9 |
|---------------------------------------------------------------------------------------------|
1. | 69 SRA Co-op.Housing Society Ltd. 156-F/233 - 47 |
2. | 70 Jai Bhavani CHS Ltd. (Proposed) 7 (Pt.) |
3. | 71 Bhavani Housing 156-B/70 - 89 |
4. | 72 Shivshakti SRA CHS Ltd. 364 ‘A’ |
5. | 73 Shree Ram CHS Ltd. (Prop.) |
|---------------------------------------------------------------------------------------------|
6. | 74 Ram CHS Ltd. (Prop.) 156-D/158 - 69 |
+---------------------------------------------------------------------------------------------+
The modified code snippet:
preserve
generate tag = 0
replace tag = 1 if !strmatch(CTSNo3, "*/*") & !strmatch(CTSNo4, "*/*") & ///
!strmatch(CTSNo9, "*/*")
keep if tag == 1
save base, replace
restore
ds CTSNo*
local CTSvars "`r(varlist)'"
foreach var of local CTSvars {
preserve
generate tag = 0
replace tag = 1 if strmatch(`var', "*/*")
keep if tag == 1
generate part0 = substr(`var', 1, strpos(`var', "/"))
generate part1 = substr(`var', strpos(`var', "/") + 1, strpos(`var', "-") - 1)
generate part2 = substr(`var', strrpos(`var', "-") + 1, .)
if strlen(trim(part1)) == 3 {
generate xpa = abs(real(substr(part1, 2, .)) - real(part2)) + 1
}
else {
generate xpa = abs(real(part1) - real(part2)) + 1
}
expand xpa
bysort SRNo (`var'): egen interim = seq()
bysort SRNo (`var'): generate N`var' = part0 + string(real(part1) + interim - 1)
drop tag part0 part1 part2 xpa interim
list
save `var', replace
restore
}
use base, clear
append using `CTSvars'
sort SRNo NCTS*
The final result:
list SRNo SchemeName NCTS*
+-----------------------------------------------------------------------------+
| SRNo SchemeName NCTSNo3 NCTSNo4 NCTSNo9 |
|-----------------------------------------------------------------------------|
1. | 69 SRA Co-op.Housing Society Ltd. 156-F/233 |
2. | 69 SRA Co-op.Housing Society Ltd. 156-F/234 |
3. | 69 SRA Co-op.Housing Society Ltd. 156-F/235 |
4. | 69 SRA Co-op.Housing Society Ltd. 156-F/236 |
5. | 69 SRA Co-op.Housing Society Ltd. 156-F/237 |
|-----------------------------------------------------------------------------|
6. | 69 SRA Co-op.Housing Society Ltd. 156-F/238 |
7. | 69 SRA Co-op.Housing Society Ltd. 156-F/239 |
8. | 69 SRA Co-op.Housing Society Ltd. 156-F/240 |
9. | 69 SRA Co-op.Housing Society Ltd. 156-F/241 |
10. | 69 SRA Co-op.Housing Society Ltd. 156-F/242 |
|-----------------------------------------------------------------------------|
11. | 69 SRA Co-op.Housing Society Ltd. 156-F/243 |
12. | 69 SRA Co-op.Housing Society Ltd. 156-F/244 |
13. | 69 SRA Co-op.Housing Society Ltd. 156-F/245 |
14. | 69 SRA Co-op.Housing Society Ltd. 156-F/246 |
15. | 69 SRA Co-op.Housing Society Ltd. 156-F/247 |
|-----------------------------------------------------------------------------|
16. | 70 Jai Bhavani CHS Ltd. (Proposed) |
17. | 71 Bhavani Housing 156-B/70 |
18. | 71 Bhavani Housing 156-B/71 |
19. | 71 Bhavani Housing 156-B/72 |
20. | 71 Bhavani Housing 156-B/73 |
|-----------------------------------------------------------------------------|
21. | 71 Bhavani Housing 156-B/74 |
22. | 71 Bhavani Housing 156-B/75 |
23. | 71 Bhavani Housing 156-B/76 |
24. | 71 Bhavani Housing 156-B/77 |
25. | 71 Bhavani Housing 156-B/78 |
|-----------------------------------------------------------------------------|
26. | 71 Bhavani Housing 156-B/79 |
27. | 71 Bhavani Housing 156-B/80 |
28. | 71 Bhavani Housing 156-B/81 |
29. | 71 Bhavani Housing 156-B/82 |
30. | 71 Bhavani Housing 156-B/83 |
|-----------------------------------------------------------------------------|
31. | 71 Bhavani Housing 156-B/84 |
32. | 71 Bhavani Housing 156-B/85 |
33. | 71 Bhavani Housing 156-B/86 |
34. | 71 Bhavani Housing 156-B/87 |
35. | 71 Bhavani Housing 156-B/88 |
|-----------------------------------------------------------------------------|
36. | 71 Bhavani Housing 156-B/89 |
37. | 72 Shivshakti SRA CHS Ltd. |
38. | 73 Shree Ram CHS Ltd. (Prop.) |
39. | 74 Ram CHS Ltd. (Prop.) 156-D/158 |
40. | 74 Ram CHS Ltd. (Prop.) 156-D/159 |
|-----------------------------------------------------------------------------|
41. | 74 Ram CHS Ltd. (Prop.) 156-D/160 |
42. | 74 Ram CHS Ltd. (Prop.) 156-D/161 |
43. | 74 Ram CHS Ltd. (Prop.) 156-D/162 |
44. | 74 Ram CHS Ltd. (Prop.) 156-D/163 |
45. | 74 Ram CHS Ltd. (Prop.) 156-D/164 |
|-----------------------------------------------------------------------------|
46. | 74 Ram CHS Ltd. (Prop.) 156-D/165 |
47. | 74 Ram CHS Ltd. (Prop.) 156-D/166 |
48. | 74 Ram CHS Ltd. (Prop.) 156-D/167 |
49. | 74 Ram CHS Ltd. (Prop.) 156-D/168 |
50. | 74 Ram CHS Ltd. (Prop.) 156-D/169 |
+-----------------------------------------------------------------------------+
@Nick Cox's Note:
I haven't studied the problem, just your solution. The following version includes some simplifications. Take what you want and ignore the rest.
clear
input int SRNo str200 SchemeName str30 CTSNo3 str15 CTSNo4 str15 CTSNo9
69 "SRA Co-op.Housing Society Ltd." " 156-F/233 - 47" ""
70 "Jai Bhavani CHS Ltd. (Proposed)" "7 (Pt.)" ""
71 "Bhavani Housing" " " "156-B/70 - 89 " ""
72 "Shivshakti SRA CHS Ltd." "364 ‘A’" ""
73 "Shree Ram CHS Ltd. (Prop.)" " " ""
74 "Ram CHS Ltd. (Prop.)" " " " " " 156-D/158 - 69 "
end
list
preserve
generate tag = !strmatch(CTSNo3, "*/*") & !strmatch(CTSNo4, "*/*") & ///
!strmatch(CTSNo9, "*/*")
keep if tag
save base, replace
restore
unab CTSvars : CTSNo*
foreach var of local CTSvars {
preserve
generate tag = strmatch(`var', "*/*")
keep if tag
generate part0 = substr(`var', 1, strpos(`var', "/"))
generate part1 = substr(`var', strpos(`var', "/") + 1, strpos(`var', "-") - 1)
generate part2 = substr(`var', strrpos(`var', "-") + 1, .)
if strlen(trim(part1)) == 3 {
generate xpa = abs(real(substr(part1, 2, .)) - real(part2)) + 1
}
else {
generate xpa = abs(real(part1) - real(part2)) + 1
}
expand xpa
bysort SRNo (`var'): generate N`var' = part0 + string(real(part1) + _n - 1)
drop tag part0 part1 part2 xpa
list
save `var', replace
restore
}
use base, clear
append using `CTSvars'
sort SRNo NCTS*
list SRNo SchemeName NCTS*
EDIT:
When you have more than one observation in a CTSNo variable, the following portion of the code:
if strlen(trim(part1)) == 3 {
generate xpa = abs(real(substr(part1, 2, .)) - real(part2)) + 1
}
else {
generate xpa = abs(real(part1) - real(part2)) + 1
}
Should be replaced with:
drop tag
generate tag = strlen(trim(part1))
generate xpa = .
replace xpa = abs(real(part1) - real(part2)) + 1
replace xpa = abs(real(substr(part1, 2, .)) - real(part2)) + 1 if tag == 3
For example, if your CTSNo4 variable looked like this:
+----------------------------------------------------------+
| SRNo SchemeName CTSNo4 |
|----------------------------------------------------------|
1. | 69 SRA Co-op.Housing Society Ltd. |
2. | 70 Jai Bhavani CHS Ltd. (Proposed) |
3. | 71 Bhavani Housing 156-B/70 - 89 |
4. | 72 Shivshakti SRA CHS Ltd. |
5. | 73 Shree Ram CHS Ltd. (Prop.) |
|----------------------------------------------------------|
6. | 74 Ram CHS Ltd. (Prop.) |
7. | 75 CHS Society Housing 113-Z/160 - 72 |
+----------------------------------------------------------+
CTSNovariables of similar content? You need to provide us example data for them usingdataex.ordercommand in the outerforeachloop (which is also wrong). You do not even need theforvaluesloop as i stated in my answer yesterday.