楼主: zdlspace
5703 13

[程序分享] 文本中有空格怎么办? [推广有奖]

  • 1关注
  • 83粉丝

已卖:1037份资源

学科带头人

93%

还不是VIP/贵宾

-

威望
2
论坛币
5234 个
通用积分
8133.7812
学术水平
520 点
热心指数
536 点
信用等级
509 点
经验
52340 点
帖子
1681
精华
0
在线时间
2717 小时
注册时间
2013-7-21
最后登录
2025-11-22

楼主
zdlspace 学生认证  发表于 2021-1-22 16:01:51 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在数据处理过程中经常会遇到文本中含有空格,当我们进行merge匹配时,总是匹配失败,这时该怎么办?很多人想到的方案应该都是用subinstr将空格替换掉,但有时候你会发现subinstr可能会失效,比如下面这个例子(今天刚有人问我的)
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input str412 name
  4. "中国河南国际合作集团有限公司 "            
  5. "临沂蒙水水表有限公司 "                        
  6. "宁波中泰燃料有限公司 "                        
  7. "安瑞科(廊坊)能源装备集成有限公司 "   
  8. "新疆塔城电力有限责任公司托里供电公司 "
  9. "新疆昌源水务准东供水有限公司 "            
  10. "杭州临安恒晟实业投资有限公司 "            
  11. "青海黄河上游水电开发有限责任公司 "      
  12. end


  13. . list

  14.      +---------------------------------------+
  15.      |                                  name |
  16.      |---------------------------------------|
  17.   1. |         中国河南国际合作集团有限公司  |
  18.   2. |                 临沂蒙水水表有限公司  |
  19.   3. |                 宁波中泰燃料有限公司  |
  20.   4. |   安瑞科(廊坊)能源装备集成有限公司  |
  21.   5. | 新疆塔城电力有限责任公司托里供电公司  |
  22.      |---------------------------------------|
  23.   6. |         新疆昌源水务准东供水有限公司  |
  24.   7. |         杭州临安恒晟实业投资有限公司  |
  25.   8. |     青海黄河上游水电开发有限责任公司  |
  26.      +---------------------------------------+
复制代码

一眼望去似乎没什么问题,但仔细看一下,你会发现公司名称最后一位多了个空格。这时候如果我们采用subinstr来替换空格,你会发现,根本不起作用,不信你可以试试。
  1. . replace name=subinstr(name," ","",.)
  2. (0 real changes made)
复制代码

此时,我想到这可能不是一般意义上的空格,我猜测可能是全角空格、制表符或其他杂七杂八的空格。这个时候,正则表达式就有用武之地了,我们可以用“\s”来干掉这些莫名其妙的空格,我也不用知道你究竟是什么类型空格,全部给你干掉。
  1. . replace name=ustrregexra(name,"\s","")
  2. (8 real changes made)

  3. . list

  4.      +--------------------------------------+
  5.      |                                 name |
  6.      |--------------------------------------|
  7.   1. |         中国河南国际合作集团有限公司 |
  8.   2. |                 临沂蒙水水表有限公司 |
  9.   3. |                 宁波中泰燃料有限公司 |
  10.   4. |   安瑞科(廊坊)能源装备集成有限公司 |
  11.   5. | 新疆塔城电力有限责任公司托里供电公司 |
  12.      |--------------------------------------|
  13.   6. |         新疆昌源水务准东供水有限公司 |
  14.   7. |         杭州临安恒晟实业投资有限公司 |
  15.   8. |     青海黄河上游水电开发有限责任公司 |
  16.      +--------------------------------------+
复制代码

Wow,此时可以看到所有的顽固空白都被轻松消灭了。
结语:今后只要遇到去掉空格问题,我们都可以统一采用这种方法,不必再用subinstr了,因为有时候会失效,而上述方法针对一切顽固空格全消灭。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:怎么办 generated subinstr generate replace

回帖推荐

蓝色 发表于9楼  查看完整内容

看了你提供的dta数据 现在unicode编码中空格是有好几种编码的。 你的数据最后的空格的编码是是char(160) 而一般的空格编码是char(32)。 所以用subinstr替换不了。

蓝色 发表于2楼  查看完整内容

也可以用trim
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 鼓励积极发帖讨论
黃河泉 + 3 + 3 + 3 精彩帖子

总评分: 学术水平 + 6  热心指数 + 6  信用等级 + 6   查看全部评分

Raymond
Stata 17.0, MP(4)

沙发
蓝色 发表于 2021-1-23 10:59:22
也可以用trim
  1. replace name=trim(name)
复制代码

  1. . * Example generated by -dataex-. To install: ssc install dataex
  2. . clear

  3. . input str412 name

  4.                                                                                                                         
  5. >                                                                                                                       
  6. >                                                                                                                       
  7. >                                                          name
  8.   1. "中国河南国际合作集团有限公司 "            
  9.   2. "临沂蒙水水表有限公司 "                        
  10.   3. "宁波中泰燃料有限公司 "                        
  11.   4. "安瑞科(廊坊)能源装备集成有限公司 "   
  12.   5. "新疆塔城电力有限责任公司托里供电公司 "
  13.   6. "新疆昌源水务准东供水有限公司 "            
  14.   7. "杭州临安恒晟实业投资有限公司 "            
  15.   8. "青海黄河上游水电开发有限责任公司 "      
  16.   9. end

  17. .
  18. . replace name=trim(name)
  19. (8 real changes made)

  20. . list

  21.      +--------------------------------------+
  22.      |                                 name |
  23.      |--------------------------------------|
  24.   1. |         中国河南国际合作集团有限公司 |
  25.   2. |                 临沂蒙水水表有限公司 |
  26.   3. |                 宁波中泰燃料有限公司 |
  27.   4. |   安瑞科(廊坊)能源装备集成有限公司 |
  28.   5. | 新疆塔城电力有限责任公司托里供电公司 |
  29.      |--------------------------------------|
  30.   6. |         新疆昌源水务准东供水有限公司 |
  31.   7. |         杭州临安恒晟实业投资有限公司 |
  32.   8. |     青海黄河上游水电开发有限责任公司 |
  33.      +--------------------------------------+
复制代码

藤椅
zdlspace 学生认证  发表于 2021-1-23 14:53:12
蓝色 发表于 2021-1-23 10:59
也可以用trim
好久没看到蓝色版主留言发帖啊,太棒了!

板凳
zdlspace 学生认证  发表于 2021-1-23 15:06:18
蓝色 发表于 2021-1-23 10:59
也可以用trim
但是我发现trim只能去掉文本末尾的空格,无法去掉中间的空格:
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input str412 name
  4. "中国河南国际合作集团有限公司"            
  5. "临沂蒙水水表有限公司"                        
  6. "  宁波中   泰燃料   有限   公司   "         
  7. "安瑞科(廊坊)能源装备集成有限公司"   
  8. "新疆塔城电力有限责任公司托里供电公司"
  9. "新疆昌源水务准东供水有限公司"            
  10. "杭州临安恒晟实业投资有限公司"            
  11. "青海黄河上游水电开发有限责任公司"      
  12. end
复制代码


可以发现中间以及后面都有空格,用trim只能去掉末尾空格;
  1. . replace name=trim(name)
  2. (1 real change made)

  3. . list

  4.      +--------------------------------------+
  5.      |                                 name |
  6.      |--------------------------------------|
  7.   1. |         中国河南国际合作集团有限公司 |
  8.   2. |                 临沂蒙水水表有限公司 |
  9.   3. |        宁波中   泰燃料   有限   公司 |
  10.   4. |   安瑞科(廊坊)能源装备集成有限公司 |
  11.   5. | 新疆塔城电力有限责任公司托里供电公司 |
  12.      |--------------------------------------|
  13.   6. |         新疆昌源水务准东供水有限公司 |
  14.   7. |         杭州临安恒晟实业投资有限公司 |
  15.   8. |     青海黄河上游水电开发有限责任公司 |
  16.      +--------------------------------------+
复制代码

  1. . replace name=ustrregexra(name,"\s","")
  2. (1 real change made)

  3. . list

  4.      +--------------------------------------+
  5.      |                                 name |
  6.      |--------------------------------------|
  7.   1. |         中国河南国际合作集团有限公司 |
  8.   2. |                 临沂蒙水水表有限公司 |
  9.   3. |                 宁波中泰燃料有限公司 |
  10.   4. |   安瑞科(廊坊)能源装备集成有限公司 |
  11.   5. | 新疆塔城电力有限责任公司托里供电公司 |
  12.      |--------------------------------------|
  13.   6. |         新疆昌源水务准东供水有限公司 |
  14.   7. |         杭州临安恒晟实业投资有限公司 |
  15.   8. |     青海黄河上游水电开发有限责任公司 |
  16.      +--------------------------------------+
复制代码


所以无论空格出现在何处,都能有ustrregexra正则表达式。
Raymond
Stata 17.0, MP(4)

报纸
蓝色 发表于 2021-1-23 18:58:59
没错trim不能删除中间的空格
但是两端的应该是可以删除的
  1. clear
  2. input str40 name
  3. "  宁波中  有限   公司   "            
  4. end

  5. gen name1=trim(name)


  6. dataex name1
复制代码


  1. . clear

  2. . input str40 name

  3.                                          name
  4.   1. "  宁波中  有限   公司   "            
  5.   2. end

  6. .
  7. . gen name1=trim(name)

  8. .
  9. .
  10. . dataex name1

  11. ----------------------- copy starting from the next line -----------------------
  12. [CODE]
  13. * Example generated by -dataex-. To install: ssc install dataex
  14. clear
  15. input str26 name1
  16. "宁波中  有限   公司"
  17. end
复制代码

------------------ copy up to and including the previous line ------------------

Listed 1 out of 1 observations
[/code]

可以看出两端的都删除了

地板
蓝色 发表于 2021-1-23 19:09:26
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input str412 name
  4. "中国河南国际合作集团有限公司 "            
  5. "临沂蒙水水表有限公司 "                        
  6. "宁波中泰燃料有限公司 "                        
  7. "安瑞科(廊坊)能源装备集成有限公司 "   
  8. "新疆塔城电力有限责任公司托里供电公司 "
  9. "  新疆昌源   水务准   东供水   有限公司      "            
  10. "杭州临安恒晟实业投资有限公司 "            
  11. "  青海黄河上游水电开发   有限责任公司 "      
  12. end
  13. replace name=subinstr(name," ","",.)

  14. dataex/code]

  15. [code]. * Example generated by -dataex-. To install: ssc install dataex
  16. . clear

  17. . input str412 name

  18.                                                                                                                
  19. >                                                                                                               
  20. >                                                                                                               
  21. >                                                                                  name
  22.   1. "中国河南国际合作集团有限公司 "            
  23.   2. "临沂蒙水水表有限公司 "                        
  24.   3. "宁波中泰燃料有限公司 "                        
  25.   4. "安瑞科(廊坊)能源装备集成有限公司 "   
  26.   5. "新疆塔城电力有限责任公司托里供电公司 "
  27.   6. "  新疆昌源   水务准   东供水   有限公司      "            
  28.   7. "杭州临安恒晟实业投资有限公司 "            
  29.   8. "  青海黄河上游水电开发   有限责任公司 "      
  30.   9. end

  31. . replace name=subinstr(name," ","",.)
  32. (8 real changes made)

  33. .
  34. . dataex

  35. ----------------------- copy starting from the next line -----------------------
  36. [CODE]
  37. * Example generated by -dataex-. To install: ssc install dataex
  38. clear
  39. input str412 name
  40. "中国河南国际合作集团有限公司"            
  41. "临沂蒙水水表有限公司"                        
  42. "宁波中泰燃料有限公司"                        
  43. "安瑞科(廊坊)能源装备集成有限公司"   
  44. "新疆塔城电力有限责任公司托里供电公司"
  45. "新疆昌源水务准东供水有限公司"            
  46. "杭州临安恒晟实业投资有限公司"            
  47. "青海黄河上游水电开发有限责任公司"      
  48. end
复制代码

------------------ copy up to and including the previous line ------------------

Listed 8 out of 8 observations
[/code]

我这里运行是可以删除的

7
zdlspace 学生认证  发表于 2021-1-23 21:24:26
好奇怪,这个数据在dta文件里时,运用subinstr是不行的,但是用dataex复制出来放在帖子中,然后再复制粘贴过去后,就可以用subinstr了。你可以试一下附件中的dta文件,就知道subinstr不行了,除非你把数据复制到其他地方,比如txt中,再复制回来,就可以用subinstr了。 1.dta (9.73 KB)


Raymond
Stata 17.0, MP(4)

8
zdlspace 学生认证  发表于 2021-1-24 13:26:27 来自手机
帖子中通过dataex给的数据,通过这种复制粘贴的方式,数据中的特殊空格已经变成普通空格了,真正我们要解决的问题是上一楼我给的dta文件中的空格,这才是我说的顽固空格。

9
蓝色 发表于 2021-1-25 15:04:49
zdlspace 发表于 2021-1-24 13:26
帖子中通过dataex给的数据,通过这种复制粘贴的方式,数据中的特殊空格已经变成普通空格了,真正我们要解决 ...
看了你提供的dta数据
现在unicode编码中空格是有好几种编码的。
你的数据最后的空格的编码是是char(160)
而一般的空格编码是char(32)。
所以用subinstr替换不了。

10
zdlspace 学生认证  发表于 2021-1-25 16:25:11
非常感谢,我对编码这一块始终没太明白。那么char(160)是怎么用键盘打出来的呢?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-7 00:00