亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3938 | 回復(fù): 4
打印 上一主題 下一主題

請(qǐng)問Perl能按字節(jié)和位處理文本嗎?有關(guān)半個(gè)漢字處理,請(qǐng)大家?guī)兔纯闯绦騿栴}在哪呢? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-05-06 14:07 |只看該作者 |倒序?yàn)g覽
由于系統(tǒng)的問題,導(dǎo)出的文件中有許多漢字變成了半個(gè)字節(jié),想去掉

文件有規(guī)律的,每個(gè)字段用Tab符做為分割符,行結(jié)束符為換行符,字段中有半個(gè)字節(jié)的編碼。

請(qǐng)教大家了

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

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
2 [報(bào)告]
發(fā)表于 2008-05-06 17:44 |只看該作者
perl也有index, seek, sysopen喔...
可以用C的作法去解決..

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

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 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*", $_); # 以有符號(hào)的方式解包到@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))  # 第一個(gè)字節(jié)大于128,表明此為漢字的開始

&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($data[$loop + 1] == 9) # 漢字開始的頭一個(gè)字節(jié)后面跟的是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) # 漢字開始后的字節(jié)馬上是換行符

&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; # 跳出循環(huán),開始讀取下一行

&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) # 如果該字節(jié)為中文的開始

&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(($data[$loop + 1] > 64) || ($data[$loop + 1] > -128 && $data[$loop + 1] < 0)) # 與前一個(gè)字節(jié)構(gòu)成一個(gè)完整的漢字

&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 [報(bào)告]
發(fā)表于 2008-05-07 08:49 |只看該作者
上面的程序能夠處理一部分原來的文件,處理結(jié)果也是正確的,處理完20000多行后就不行了,進(jìn)入了死循環(huán),哪位朋友知道是怎么回事嗎?檢查了一晚上也沒查出來

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
5 [報(bào)告]
發(fā)表于 2008-05-07 09:35 |只看該作者
試著打印出..是從哪一行開始出問題....
檢查看看那一行是不是有什麼奇怪的char..造成無法判斷...

另外請(qǐng)多用my去宣告變量...

或加上

use strict;

與 #!/usr/bin/perl -w
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP