忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 866 | 回复: 9

文本处理求助第三弹-如何删除文本中的中文乱码? [复制链接]

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-03-04 21:52 |显示全部楼层
大家好!
我还有一个文本处理的问题向大家请教:
我用Perl脚本从数据库中读取数据生成了一个文本文件。


|No|AR-------|Description-------------------------------------------------|State------|Assigned Group---------|NCCD------[Day]|JIRA---------------|
| 1|1-6350029|C-Pipes created via OC-3 STM port operationaly down         |Resolved   |CloQ-IPD-SR&SSR-vGlobal|2016-11-29[-95]|                   |
| 2|1-6443085|DP11.3b: Command output of MCAST for 7450 CLI on SROS 13R8  |Resolved   |CloQ-IPD-SR&SSR-vGlobal|2016-11-29[-95]|                   |
| 3|1-6477220|(B2B Court 7210) 7210 SAS rebooted without any reason       |Pending    |TSCr-IPD-APAC          |2017-01-31[-32]|corp-jira:SAS-1805 |
| 4|1-6496243|[WCP][FOA][WCP-FOA001]7750 MG issue on Oct 19 (CSR respon...|Resolved   |CloQ-IPD-SR&SSR-vGlobal|2017-03-12[  7]|corp-jira:SR-24356 |
| 5|1-6527369|Can’t Login MDN-TBG-EN2-SAR8                              |Pending    |NorP-IPD-SR&SSR-vGlobal|2017-03-06[  1]|                   |
| 6|1-6528649|[WideEther][TKEvrs-45][production]  1/1/1 MC-LAG 51 has s...|Pending    |NorP-IPD-SR&SSR-vGlobal|2017-03-24[ 19]|corp-jira:ESS-6137 |
| 7|1-6536745|(KT GOA 7750) Firewall session initiation is strange        |In Progress|NorP-IPD-SR&SSR-vGlobal|2017-03-10[  5]|corp-jira:SR-25263 |
| 8|1-6559753|"pppoeCreateESMObjects: SBM IPCP session is already created"|Resolved   |CloQ-IPD-SR&SSR-vGlobal|2017-02-28[ -4]|corp-jira:SR-25724 |


这个文本应该是纯英文的,但是由于输入者的操作系统可能是中文的,所以在输入时会混进中文编码的标点符号。
比如下图中的第5行中的Can't中的单引号,由于是中文编码,导致在纯英文系统中无法正常处理,虽然显示为一个字符的单引号,但是却占用了3个字节的空间,导致本来很整齐的表格显得缩进去了2格。
1.png
2.png
我想把文本中的这种中文编码的字符串删除,或者如果它实际占用了3个字节,就显示为3个小数点...。
不知道perl脚本应该怎样写呢?
我现在只是把对应的文本删除了换行和制表符,然后如果长度超过60个字符,则截短为60个字符。
$short_des=$vals{$f{'Short Description'}};
$short_des=~ s/\n//g;
$short_des=~ s/\t//g;
if ( length($short_des) > 60 ) {
$short_des=substr($short_des,0,57) . "...";
目的就是想让表格显示比较整齐一点。
但是这些讨厌的中文标点符号使得表格不整齐。
应该如何处理呢?
请多指教。
谢谢大家。

论坛徽章:
115
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-03-05 00:06 |显示全部楼层
回复 1# bikkuri



would like this way by s/’([^|]+)/\x27$1  /g

  1. $ grep 1-652 FILE
  2. | 5|1-6527369|Can’t Login MDN-TBG-EN2-SAR8                              |Pending    |NorP-IPD-SR&SSR-vGlobal|2017-03-06[  1]|                   |
  3. | 6|1-6528649|[WideEther][TKEvrs-45][production]  1/1/1 MC-LAG 51 has s...|Pending    |NorP-IPD-SR&SSR-vGlobal|2017-03-24[ 19]|corp-jira:ESS-6137 |

  4. $ grep 1-652 FILE | perl -pe '{s/’([^|]+)/\x27$1  /g}'
  5. | 5|1-6527369|Can't Login MDN-TBG-EN2-SAR8                                |Pending    |NorP-IPD-SR&SSR-vGlobal|2017-03-06[  1]|                   |
  6. | 6|1-6528649|[WideEther][TKEvrs-45][production]  1/1/1 MC-LAG 51 has s...|Pending    |NorP-IPD-SR&SSR-vGlobal|2017-03-24[ 19]|corp-jira:ESS-6137 |


复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-03-05 00:22 |显示全部楼层
这个问题解决方法我估计有2种方法:
1.> 穷举所有的可能,进行替换 (笨人方法,不推荐,无奈之举)
2.> 等待高手支招,在英文中混杂了中文标点符号的确非常棘手

同是小白,对这个问题根本无从入手。还请 perl 版中的大神给予帮助,指点。楼主加油。。。
Jason680 大神,版主大神 zhlong8MMMIX
麻烦几位老人家现身,给小白们科普一下吧。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-03-05 00:27 |显示全部楼层
本帖最后由 sunzhiguolu 于 2017-03-05 00:31 编辑

回复 2# jason680
大神,我借楼主宝地向您请教一个问题。
如果文本中包含但不限于中文的单引号,可能还包含其他的中文标点符号。
有什么好的处理方法吗?还请您多提供几个解决思路,谢谢。。。

比如:
除了单引号之外,希望将所有的其他的中文标点符号删除掉。

论坛徽章:
115
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-03-05 00:37 |显示全部楼层
回复 3# sunzhiguolu


>> ..这个问题解决方法我估计有2种方法:

是2种方法
1. 源头改--才是上策
  直接 源文档 就是对...

2. 穷举替换--虽是下策, 但要 替换 就那么几个...
  perl -pe '{ s/xxx/.../g; s/yyy/.../g; s/zzz/.../g}'

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-03-05 00:46 |显示全部楼层
回复 5# jason680
谢谢大神指点。

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-03-05 03:29 |显示全部楼层
本帖最后由 bikkuri 于 2017-03-06 00:53 编辑

谢谢两位前辈的指点。
特别感谢jason680大神的代码,可以成功地将中文标点符号单引号替换成英文的单引号然后在文本后面加两个空格。
但是我在文本中还发现了其他的乱码,显示为一个乱码字符,占用两个字符空间,下面是一个例子。
3.png
文本的拷贝在这里:
|35|1-6646377|[VPN][KHAuqb-01][production] IO Module 2 experienced a da...|In Progress|NorP-IPD-SR&SSR-vGlobal|2017-03-06[  2]|corp-jira:SR-26202 |
|36|1-6646529|[VPN][ATUuqc-01][production] B:sysMnitor*pri0�FCOMMON:tm...|In Progress|NorP-IPD-SR&SSR-vGlobal|2017-03-12[  8]|corp-jira:XRS-1394 |
|37|1-6648374|[RR3][Chiba][Production][Restored]ICC error was detected ...|In Progress|NorP-IPD-SR&SSR-vGlobal|2017-03-06[  2]|corp-jira:SR-26219 |

结合上面那个中文标点符号单引号的例子。
2.png
我发现中文乱码字符有一个特点就是都是ASCII可打印字符(0x20~0x7E)范围以外的字符。
比如上面两个例子,第一个例子中文单引号是0xE2, 0x80, 0x99三个字符;第二个例子的中文乱码是0xC2, 0x81两个字符。

所以我想,能不能扫描文本中的字符,当发现小于0x20或者大于0x7E的字符时,就用小数点.(0x2e)来替换掉。
也就是将上面第一个例子中的0xE2, 0x80, 0x99三个字符,替换成三个0x2e;第二个例子中的0xC2, 0x81替换成两个0x2e。
不知道用perl应该如何来实现呢?
谢谢大家!

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-03-05 15:03 |显示全部楼层
回复 7# bikkuri


看来用perl -pe '{s/[\x7f-\xff]/./g}'就可以了。
5.PNG


论坛徽章:
115
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-03-05 15:50 |显示全部楼层
回复 8# bikkuri

两个都用 更好...
perl -pe '{s/([^|]+)/\x27$1  /g; s/[\x7f-\xff]/./g}'


个别(已知)先替换, 余下用点(.)替换
perl -pe '{s/xxx/.../g; s/yyy/.../g; ...; s/[\x7f-\xff]/./g}'

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2017-03-05 16:16 |显示全部楼层
非常感谢您的指点。
每次都从您这里学会好多东西。
谢谢了。

回复 9# jason680



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

本版积分规则

SACC2017购票8.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月2日前

活动链接>>
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP