LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1343|回复: 3

谁能帮我写个perl脚本

[复制链接]
发表于 2006-4-9 17:44:15 | 显示全部楼层 |阅读模式
谁能帮我写个perl脚本让附件文本转变成下面格式?感激不尽!
打daa1       
咑daa1               
花faa1
華faa1
蘤faa1
化faa1
嘩faa1
錵faa1
家gaa1
加gaa1
嘉gaa1
傢gaa1
......

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2006-4-10 16:31:29 | 显示全部楼层
你给的文件编码很奇怪,用的是ucs-2le。
我把它转成utf8会,用下面的awk命令处理:
awk {'for(i=2;i<=NF;i++) print $i $1'} utf8_file
打daa1
咑daa1
花faa1
華faa1
蘤faa1
化faa1
嘩faa1
錵faa1
家gaa1
...
处理后的结果放在附件里。不知道楼主是否一定用perl处理?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-10 21:00:39 | 显示全部楼层
嗯,我现在只能用公共计算机,没办法在Linux下工作
这计算机里面装有windows版的perl,所以只能用perl解决一点繁琐的问题。
我看了一天书,写了个脚本,如下:

  1. [size=3]open (FILE1,"d:\1.txt")||die ("不能打开1.TXT。\n");
  2. [i][color="Red"]#打开待转换文件1.txt。[/color][/i]
  3. while ($line=&ltfile>)
  4. [i][color="Red"]#读入一行。[/color][/i]
  5. {
  6. $py=$line;
  7. $hz=$line;
  8. $py=~ /^[\w]+/;
  9. [i][color="red"]#去掉$py值后面的汉字和空格。[/color][/i]
  10. $hz=~ /^[\S]*[\W]+/;
  11. [i][color="Red"]#去掉$hz值中的非汉字字符。[/color][/i]
  12. chop ($hz);[i][color="red"]
  13. #去掉$hz值最后的换行符。[/color][/i]
  14. @dhz=split (//,$hz);
  15. [i][color="red"]#将$hz中的汉字串劈成一个个单独的汉字装入数组@dhz中。[/color][/i]
  16. @rhz=map ($_.$py.\n,@dhz);
  17. [i][color="red"]#将$dhz中的每一个汉字加上$py的值和换行符,装入数组@rhz中。[/color][/i]
  18. open (FILE2,">>d:\2.txt")||die ("不能打开2.TXT。\n");
  19. [i][color="red"]#创建一个新文档,方便后续循环中追加数据。[/color][/i]
  20. print FILE2 ("@rhz");
  21. [i][color="red"]#将$rhz中的东西写入2.txt。[/color][/i]
  22. close (FILE2);
  23. [i][color="red"]#关掉2.txt。[/color][/i]
  24. @dhz=();
  25. @rhz=();
  26. [i][color="red"]#清空两个数组。[/color][/i]
  27. }
  28. [i][color="red"]#回去循环读下一行,再处理。[/color][/i]
  29. cloze (FILE1);[/size]
复制代码

不知道为什么运行起来老是出错,说是第3行和第16行有语法错误。不解。能给我改改么?
我这个脚本转换的文本文档(1.txt)和上面的那个附件基本相同,只是各个汉字之间没有空格。

我初学perl,不太懂。shell也只会一点
回复 支持 反对

使用道具 举报

发表于 2006-4-10 22:54:04 | 显示全部楼层
perl我也不太熟悉,google + 一些电子书搞定了这个问题,楼主见笑了。

windows下使用的unicode编码为utf-16,或者是utf-16LE,具体不太清楚,不过使用utf-16可以工作的很好。
下面是我的代码:
  1. my $file1 = 'c:\2.txt';
  2. my $file2 = 'c:\3.txt';

  3. open (FILE1, "< :encoding(UTF-16)", $file1)||die ("can not open $file1\n");
  4. open (FILE2, ">$file2")||die ("can not open $file2\n");
  5. select(FILE2);

  6. while (<FILE1>)
  7. {
  8.     if (/(^[a-z0-9]+)(.+)/) {
  9.         my $hzs = $2;
  10.         chop($hzs);
  11.         my @hz = split(//, $hzs);
  12.         for $i (0..$#hz) {
  13.             use bytes;
  14.             print($hz[$i], $1, "\n");
  15.             no bytes;
  16.         }
  17.     }
  18. }

  19. close(FILE1);
  20. close(FILE2);
复制代码

输入格式为:
  1. daa1打咑
  2. faa1花華蘤化嘩錵
  3. gaa1家加嘉傢枷迦嘎噶伽袈鎵痂葭豭尕癿泇珈笳耞跏椵犌鴐茄猳麚瘕釓毠貑
复制代码


输出为:
  1. 打daa1
  2. 咑daa1
  3. 花faa1
  4. 華faa1
  5. 蘤faa1
  6. 化faa1
  7. 嘩faa1
  8. 錵faa1
  9. 家gaa1
  10. 加gaa1
  11. 嘉gaa1
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表