免费注册 查看新帖 |

Chinaunix

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

请各位指点下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-28 11:03 |只看该作者 |倒序浏览
我现在在处理一个文本文件,文件每一行大概是

F1(0)=sfasf12.34sdf|F2(0)=sf-23csf45|F3(0)=6|F3(1)=sa8|F4(0)=rdsfgfd

现在要做成一个hash,key是F1,F2,F3,值分别是后面的第一个数字,如果key相同,值要相加,例如上面的是:
F1=>12.34
F2=>-23
F3=>14
F4=>

不知道该怎么搞,请各位指点下。谢谢。

PS:CU这两天出啥状况了?

论坛徽章:
0
2 [报告]
发表于 2012-06-28 11:51 |只看该作者
my %test_new;
$c = "F1(0)=sfasf12.34sdf|F2(0)=sf-23csf45|F3(0)=6|F3(1)=sa8|F5(0)=rdsfgfd";

%test = split /\||=/, $c;
while ( ( my $key, my $value ) = each %test ) {

        $key =~ /F(\d+)/;
        my $key_new = $&;

        $value =~ /-?(\d+)\.?(\d*)/;
        my $value_new = $&;

##        my %test_new = ( $key_new => $value_new );

        if ( exists $test_new{$key_new} ) {
                ##$test_new{$key_new} = $test_new{$key_new} + $value_new;
                %test_new = ( $key_new => $test_new{$key_new} + $value_new );
        }
        else {
                %test_new = ( $key_new => $value_new );
        }

        while ( ( my $a, my $b ) = each %test_new ) {
                print "$a=>$b\n";
        }
}


F3=>8
F1=>12.34
F5=>F5
F3=>6
F2=>-23


总是F3的加不上去。。。

论坛徽章:
0
3 [报告]
发表于 2012-06-28 11:59 |只看该作者
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use warnings;
  4. my %hashData;
  5. my $number=0;
  6. while (<DATA>) {
  7.         while(s/(.*?)\|//){
  8.                 $1 =~/F(\d)\(\d*\)=[a-z]*(\-?\d*\.?\d*)/;
  9.                 $number=$2;
  10.                 $number=0 if $2 eq "";
  11.                 if(exists $hashData{"$1"}){
  12.                         $hashData{"$1"}+=$number;
  13.                 #       print $2;
  14.                 }else{
  15.                         $hashData{"$1"}=$number;
  16.                 }
  17.         }
  18.                 $_ =~/F(\d)\(\d*\)=[a-z]*(\d*\.?\d*)/;
  19.                 $number=$2;
  20.                 $number=0 if $2 eq "";
  21.                 if(exists $hashData{"$1"}){
  22.                         $hashData{"$1"}+=$number;
  23.                 }else{
  24.                         $hashData{"$1"}=$number;
  25.                 }
  26. }
  27. while ( my ($key,$value) = each %hashData){
  28.         print "$key => $value \n";

  29. }

  30. __DATA__
  31. F1(0)=sfasf12.34sdf|F2(0)=sf-23csf45|F3(0)=6|F3(1)=sa8|F4(0)=rdsfgfd
复制代码
./lianxi.pl

4 => 0
1 => 12.34
3 => 14
2 => -23

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
4 [报告]
发表于 2012-06-28 12:32 |只看该作者
本帖最后由 cdtits 于 2012-06-28 13:28 编辑
  1. #!/usr/bin/env perl

  2. %fdict;
  3. while (<DATA>) {
  4.     while (/(F\d+).*?=.*?(-?\d+(?:\.\d+)?).*?(?:$|(?=\|))/g) {
  5.         $fdict{$1} += ($2 || 0);
  6.     }
  7. }
  8. while (($k, $v) = each %fdict) {
  9.     print "$k => $v\n";
  10. }

  11. __DATA__
  12. F1(0)=sfasf12.34sdf|F2(0)=sf-23csf45|F3(0)=6|F3(1)=sa8|F4(0)=rdsfgfd
复制代码

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
5 [报告]
发表于 2012-06-28 13:52 |只看该作者
本帖最后由 cdtits 于 2012-06-28 13:52 编辑
  1. #!/usr/bin/env perl

  2. use strict;
  3. use warnings;

  4. my %fdict;
  5. while (<DATA>) {
  6.     my @datas = split /\|/;
  7.     foreach my $d (@datas) {
  8.         my ($k, $v) = split /=/, $d;
  9.         $k =~ s/\(.*\)//;
  10.         $v =~ s/.*?(-?\d+(\.\d+)?).*/$1/;
  11.         $v =~ s/[^-.\d]+//g;
  12.         $fdict{$k} += $v || 0;
  13.     }
  14. }
  15. while (my ($k, $v) = each %fdict) {
  16.     print "$k => $v\n";
  17. }

  18. __DATA__
  19. F1(0)=sfasf12.34sdf|F2(0)=sf-23csf45|F3(0)=6|F3(1)=sa8|F4(0)=rdsfgfd
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-06-28 15:51 |只看该作者
use strict;
use warnings;

my $filename = "d:/cc/cc.txt";
my %h;

open FILE,$filename ||die '$!';
while(my $LINE=<FILE>)
{
        my @LINE=split /\|/,$LINE;
        #print $LINE;
        if($LINE=~/(\w+\(\d+\))(=[a-z]+)(\d+.\d+)/)
        {
   $h{$1}=$3;
        }
}
close FILE;

while((my $k,my $v) = each %h)
{
        print "$k,$v\n";
}

论坛徽章:
0
7 [报告]
发表于 2012-06-28 16:23 |只看该作者
谢谢各位。我已经解决了

my %test_new;
my $key_new;
my $value_new;

open( FILEIN, "test0622.data" ) || die("test0622.data file not find!");

while (<FILEIN>) {
        %test = split /\||=/;
        while ( ( my $key, my $value ) = each %test ) {

                if ( $key =~ /(F\d+)/ ) {
                        $key_new = $1;
                }
                if ( $value =~ /(\-?\d+\.?\d*)/ ) {
                        $value_new = $1;
                }
                else {
                        $value_new = 0;
                }
                if ( exists $test_new{"$key_new"} ) {
                        $test_new{"$key_new"} += $value_new;
                }
                else {
                        $test_new{"$key_new"} = $value_new;
                }

        }
        while ( ( my $a, my $b ) = each %test_new ) {
                print "$a=>$b\n";

        }
        %test_new = ();

}



论坛徽章:
0
8 [报告]
发表于 2012-06-28 17:16 |只看该作者
#!D:\strawberry\perl\bin\perl5.12.3 -w

use strict;
use warnings;

my $filename = "d:/cc/cc.txt";
my %h;

open FILE,$filename ||die '$!';
while(my $LINE=<FILE>)
{
        my @LINE=split /\|/,$LINE;
        while(<@LINE>)
        {
                        #print $_,"\n";
                        if($_=~/(\w+)(\(\d+\))=([a-z]+)(-?\d+.?\d+)/)
                        {
                                if(exists $h{"$1"})
                                {
                                        $h{"$1"}+=$4;
        }else{
                $h{"$1"}=$4;
        }
                        }elsif ($_=~/(\w+)(\(\d+\))=([0-9]+)/)
                        {
                                                                if(exists $h{"$1"})
                                {
                                        $h{"$1"}+=$3;
        }else{
                $h{"$1"}=$3;
        }
                        }elsif ($_=~/(\w+)(\(\d+\))=([a-z]+)([0-9]+)/)
                        {
                                                                if(exists $h{"$1"})
                                {
                                        $h{"$1"}+=$4;
        }else{
                $h{"$1"}=$4;
        }
                        }elsif ($_=~/(\w+)(\(\d+\))=([a-z]+)/)
                        {
                                                                if(exists $h{"$1"})
                                {
                                        $h{"$1"}+="";
        }else{
                $h{"$1"}="";
        }
                        }
        }
}
close FILE;

while((my $k,my $v) = each %h)
{
        print "$k=>$v\n";
}
-----------------------
结果:
D:\PERL练习程序>cc.pl
F4=>
F3=>14
F2=>-23
F1=>12.34
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP