免费注册 查看新帖 |

Chinaunix

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

关于文件内字符替换的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-10 16:56 |只看该作者 |倒序浏览
最近在处理数据的时候遇到一个问题,关于匹配替换的。
text1.txt


1432;3551;51135;5518;5519;5520;5522;55844;5970
1432;3551;51701;5608;9020;9064
1432;3551;5595;5601;5602;5608
1432;3551;5595;5601;5602;5970;8767
1432;3551;5608;7186;9020;9064
1432;3659;5610;5970;9451
1432;3659;5610;673;9451
1432;3725;5595;5601;5602


text2.txt文件里面只有两列,分别是数字对应字符,例如

1432 adec
2778 lkhj
2799 snjkl
2811 sdf
2821 pop
2885 myc
2977 myb
3033 cde
.....

现在想把text1.txt中的字符匹配到text2.txt中,然后输出到text3.txt中。


之前也做过匹配替换的
但是对于多次出现的字符“1432",总是自动去重。这样得不到我想要的结果。

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
2 [报告]
发表于 2012-10-10 17:07 |只看该作者
自动去重是什么意思

论坛徽章:
0
3 [报告]
发表于 2012-10-10 17:08 |只看该作者
回复 2# yybmsrs

就是说原始文件每一行里面都有”1432”,可是结果里面只有一个1432的对应了。


   

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
4 [报告]
发表于 2012-10-10 17:16 |只看该作者
你是怎么处理的?

论坛徽章:
0
5 [报告]
发表于 2012-10-10 17:21 |只看该作者
回复 4# yybmsrs

首先是把原始文件的数字都变成一列,如下


1432
2212
2214
3684
3689
1432
27330
2885
3667
3845
4804
5163
5290
5595
673
1432
27330
3845
5290
5595
5604
673
1432
27330
3845
5290
5595
673
1432
27330
3845
5290
5595
673
1432
2932
4772
4773
5530
5532
5534
1432
3551
3725
51135
5518
5519
5520
...


然后
  1. my $a="text2.txt";
  2. my $b="text1.txt";
  3. open IN1, $a or die "can't open $a";
  4. open IN2, $b or die "can't open $b";
  5. open OUT, '>', "out.txt" or die "can't open out.txt";

  6. my @data = <IN1>;
  7. sub func
  8. {

  9.         my ($str, @arr) = @_;
  10.         for (my $i=0; $i<=$#arr; ++$i)
  11.         {
  12.                 chomp($arr[$i]);
  13.                 if ($str eq $arr[$i])
  14.                 {
  15.                         return 1;
  16.                 }
  17.         }        
  18.         return 0;
  19. }

  20. my @names = <IN2>;

  21. foreach my $i (0..$#data){
  22.                  my @line2 = split(/\s+/,$data[$i]);
  23.                  my $name2 = shift @line2;
  24.                  if (func($name2, @names))
  25.                  {
  26.                         print OUT $data[$i];
  27.                        }
  28.             }   
复制代码
结果...
不是我想要的

   

论坛徽章:
0
6 [报告]
发表于 2012-10-10 17:33 |只看该作者

我写了一个,
  1. #!/usr/bin/perl -w

  2. use strict;

  3. my $a="text1.txt";
  4. my $b="text2.txt";
  5. open IN1, $a or die "can't open $a";
  6. open IN2, $b or die "can't open $b";
  7. open OUT, '>', "out.txt" or die "can't open out.txt";

  8. while(<IN2>)
  9. {chomp;@m=split(" ",$_);$h{$m[1]}=$m[2];
  10. }
  11. while(<IN1>)
  12. {
  13. chomp;
  14. @m=split(";";$_);
  15. for (0..$#m){$m[$_]=$h{$m[$_]} if exists($h{$m[$_]});}
  16. print OUT join(";",@m);
  17. print OUT "\n";
  18. }
复制代码
显示好多错误

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
7 [报告]
发表于 2012-10-10 17:41 |只看该作者
回复 6# xingzhou823


错误是因为变量没有定义,应该用my定义一下再用。
   
$h{$m[1]}=$m[2]改为$h{$m[0]}=$m[1],然后把use strict;去掉试试

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期: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未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2012-10-10 17:49 |只看该作者
本帖最后由 jason680 于 2012-10-10 17:50 编辑

回复 1# xingzhou823

$ perl number_to_word.pl
file in  = text1.txt
file key = text2.txt
file out  = text3.txt

$ cat text1.txt
1432;3551;51135;5518;5519;5520;5522;55844;5970
1432;3551;51701;5608;9020;9064

$ cat text2.txt
1432 adec
3551 xxx


$ cat text3.txt
adec;xxx;51135;5518;5519;5520;5522;55844;5970
adec;xxx;51701;5608;9020;9064

$ cat number_to_word.pl
#! /usr/bin/env perl

use strict;
use warnings;

my $sFile_in  = "text1.txt";
my $sFile_key = "text2.txt";
my $sFile_out = "text3.txt";

open(my $FHin,  "<", $sFile_in)  or die "can't open $sFile_in\n";
open(my $FHkey, "<", $sFile_key) or die "can't open $sFile_key\n";
open(my $FHout, ">", $sFile_out) or die "can't open $sFile_out\n";

my %hWord;
while(<$FHkey>;){
  chomp;
  my ($sKey, $sWord) = split;
  $hWord{$sKey} = $sWord;
}
while(<$FHin>;){
  s/(\d+)/defined $hWord{$1}?$hWord{$1}:$1/ge;
  print {$FHout} $_;
}
close $FHin;
close $FHkey;
close $FHout;

print "file in  = $sFile_in\n";
print "file key = $sFile_key\n";
print "file out  = $sFile_out\n";


   

论坛徽章:
0
9 [报告]
发表于 2012-10-10 17:55 |只看该作者
  回复 7# yybmsrs

我改了一下,把@m改成了my @m,再有修改了你说的 $h{$m[1]}=$m[2]改为$h{$m[0]}=$m[1],然后把use strict

还是显示错误,关键是我还看不明白是什么错误:



syntax error at gene.pl line 16,near "";";"
syntax error at gene.pl line 16,near "$_)"
Execution of gene.pl aborted due to compilation errors.



其中第16行的内容是
  1. my @m=split(";";$_);
复制代码
我把“;”改成了“,”,然后就成功了
   

论坛徽章:
0
10 [报告]
发表于 2012-10-10 18:26 |只看该作者
回复 8# jason680

嗯,按照你的code,稍微改了两个标点,跑出了正确的结果。

我知道你的意思,可我是个菜鸟,没有系统的学习,基础很差,却被硬硬的处理这些数据,哎


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP