免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3925 | 回复: 4
打印 上一主题 下一主题

请问Perl能按字节和位处理文本吗?有关半个汉字处理,请大家帮忙看看程序问题在哪呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-06 14:07 |只看该作者 |倒序浏览
由于系统的问题,导出的文件中有许多汉字变成了半个字节,想去掉

文件有规律的,每个字段用Tab符做为分割符,行结束符为换行符,字段中有半个字节的编码。

请教大家了

[ 本帖最后由 zhouhaiming 于 2008-5-7 08:54 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-05-06 17:44 |只看该作者
perl也有index, seek, sysopen喔...
可以用C的作法去解决..

[ 本帖最后由 apile 于 2008-5-6 17:55 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-05-07 08:47 |只看该作者
open(FH1, "<C:\\dw_ar_cust_info_351001.out") or die("Cann't open this file");
open(FH2, ">C:\\dw_ar_cust_info_351001.out.zhm") or die("cann't open this file");

print "operation running\n";

while (<FH1>)
{
&nbsp;&nbsp;@data = ();
&nbsp;&nbsp;@data = unpack("c*", $_); # 以有符号的方式解包到@array中

&nbsp;&nbsp;$length = $#data + 1;

&nbsp;&nbsp;@tmpdata = ();
&nbsp;&nbsp;
&nbsp;&nbsp;
&nbsp;&nbsp;$loop = 0;
&nbsp;&nbsp;for ( ; $loop<$length ; )
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;if (($data[$loop]>-128 && $data[$loop]<0))  # 第一个字节大于128,表明此为汉字的开始

&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($data[$loop + 1] == 9) # 汉字开始的头一个字节后面跟的是Tab符

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push(@tmpdata, $data[$loop + 1]); # 把Tab符压入栈中

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$loop = $loop + 2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($data[$loop + 1] == 10) # 汉字开始后的字节马上是换行符

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push(@tmpdata, $data[$loop + 1]); # 把换行符压入栈中

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last; # 跳出循环,开始读取下一行

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if ($data[$loop] > -128 && $data[$loop] < 0) # 如果该字节为中文的开始

&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(($data[$loop + 1] > 64) || ($data[$loop + 1] > -128 && $data[$loop + 1] < 0)) # 与前一个字节构成一个完整的汉字

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push(@tmpdata, $data[$loop]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push(@tmpdata, $data[$loop + 1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$loop = $loop + 2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else # 合法的ASCII字符

&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push(@tmpdata, $data[$loop]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$loop=$loop+1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;

&nbsp;&nbsp;$output=pack("c*", @tmpdata);
&nbsp;&nbsp;print FH2 $output;
}
print "operation success\n";
close(FH1);
close(FH2);

论坛徽章:
0
4 [报告]
发表于 2008-05-07 08:49 |只看该作者
上面的程序能够处理一部分原来的文件,处理结果也是正确的,处理完20000多行后就不行了,进入了死循环,哪位朋友知道是怎么回事吗?检查了一晚上也没查出来

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2008-05-07 09:35 |只看该作者
试着打印出..是从哪一行开始出问题....
检查看看那一行是不是有什麽奇怪的char..造成无法判断...

另外请多用my去宣告变量...

或加上

use strict;

与 #!/usr/bin/perl -w
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP