免费注册 查看新帖 |

Chinaunix

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

求教!关键字段相同的数据合计问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-01 09:54 |只看该作者 |倒序浏览
有一文本:
0001|abc|100.00
0002|ccc|200.00
0004|ddd|300.00
0001|abc|50.00
0001|abc|10.00
0002|ccc|100.00

第一个字段相同的后面金额合计后生成:
0001|abc|160.00
0002|ccc|300.00
0004|ddd|300.00

求perl如何写呢?谢谢!!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-08-01 11:36 |只看该作者

求教!关键字段相同的数据合计问题?

用split 去切 "\|",
用hash以第一個字段為key...第三個字段累加..最後print出來...
很簡單吧...

论坛徽章:
0
3 [报告]
发表于 2005-08-01 20:29 |只看该作者

求教!关键字段相同的数据合计问题?

保存文件 08011934:
0001|abc|100.00
0002|ccc|200.00
0004|ddd|300.00
0001|abc|50.00
0001|abc|10.00
0002|ccc|100.00

perl:

#

open( HFILE, "08011934" );
@line = <HFILE>;;
%res = {};

foreach ( @line )
{
        $_ =~ /(\d+\|[a-zA-Z]+\|)(\d+\.\d+)/;
       
       
        if ( $res{$1} )
        {
                $res{$1} += $2;
        }
        else
        {
                $res{$1} = $2;
        }
}

foreach ( keys( %res ) )
{
        print $_ . $res{$_} . "\n";
}

但是结果是这样的:

0004|ddd|300.00
HASH(0xa01116c)
0001|abc|160
0002|ccc|300

请高手指教

论坛徽章:
0
4 [报告]
发表于 2005-08-01 21:30 |只看该作者

求教!关键字段相同的数据合计问题?

原帖由 "gtlxx" 发表:
\|)(\d+\.\d+)/;
       
       
        if ( $res{$1} )
        {
                $res{$1} += $2;
        }
        else
        {
                $res{$1} = $2;
        }
}

foreach ( keys( %res ) )
{
        print $_ . $res{$_} . "\n";
}

但是结果是这样的:


0004|ddd..........

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my %hash;

  5. open FH,"yourfile" or die
  6. while (<FH>;) {
  7.   /^(\d\|\w+\|)(.*)$/;
  8.   $hash{$1} += $2;
  9. }
  10. close FH;

  11. foreach (sort {$a cmp $b} keys %hash) {
  12.   print $_.$hash{$_},"\n";
  13. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2005-08-01 23:53 |只看该作者

求教!关键字段相同的数据合计问题?

For Example:

  1. 1 #!/usr/bin/perl -w
  2. 2 use strict;
  3. 3
  4. 4 my @data = (
  5. 5     '0001|abc|100.00',
  6. 6     '0002|ccc|200.00',
  7. 7     '0004|ddd|300.00',
  8. 8     '0001|abc|50.00',
  9. 9     '0001|abc|10.00',
  10. 10     '0002|ccc|100.00'
  11. 11 );
  12. 12
  13. 13 my %new_data = ();
  14. 14 foreach (@data) {
  15. 15     my ($id, $name, $cost) = split(/\|/, $_, 3);
  16. 16     print "$id | $name | $cost\n";
  17. 17     $new_data{$id}{'name'} = $name;
  18. 18     $new_data{$id}{'sum'} += $cost;
  19. 19 }
  20. 20
  21. 21 print '=' x 20 , "\n";
  22. 22
  23. 23 foreach my $id (sort %new_data) {
  24. 24     if ($new_data{$id}) {
  25. 25         my $new_line = $id . ' | ' . $new_data{$id}->;{'name'}.
  26. 26             ' | ' . sprintf("%.2f", $new_data{$id}->;{'sum'});
  27. 27         print "$new_line\n";
  28. 28     }
  29. 29 }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP