免费注册 查看新帖 |

Chinaunix

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

求助,怎样多个文件对比合并出结果? [复制链接]

论坛徽章:
1
金牛座
日期:2014-03-21 18:22:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-18 14:46 |只看该作者 |倒序浏览
30可用积分
本帖最后由 lockeyou 于 2016-08-18 14:47 编辑

txt1
13288888888,1
13288888889,7

txt2
13288888888,200
13288888890,5000

txt3
xa,1,张三,男,13288888888,0,0,0,0,,,,
sh,2,李四,男,13288888889,0,0,0,0,,,,
sh,3,王五,女,13288888890,0,0,0,0,,,,
bj,4,毛六,男,13288888891,0,0,0,0,,,,

txt4
xa,1,张三,男,13288888888,1,0,200,0,,,,
sh,2,李四,男,13288888889,7,0,0,0,,,,
sh,3,王五,女,13288888890,0,0,5000,0,,,,
bj,4,毛六,男,13288888891,0,0,0,0,,,,

PS:txt4就是想要的答案
另想请教一下大牛在linux环境下对excel某几个单元格修改有没有方法,tks
原因,原本是根据sql求出值写到excel里,但是excel修改单元格貌似只有在win下才可以用,后决定先把结果写到txt里面进行操作,操作完成后再创建对应excel进行展示。

最佳答案

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
2 [报告]
发表于 2016-08-18 14:46 |只看该作者
这样?
  1. #!perl
  2. use strict;

  3. open my $fh1, '<', 'txt1';
  4. my $data_href = +{};
  5. while (defined (my $line = readline $fh1)) {
  6.     chomp $line;
  7.     my ($phone_number, $times) = split /,/, $line;
  8.     $data_href->{$phone_number}->{'times'} = $times;
  9. }
  10. close $fh1;

  11. open my $fh2, '<', 'txt2';
  12. while (defined (my $line = readline $fh2)) {
  13.     chomp $line;
  14.     my ($phone_number, $score) = split /,/, $line;
  15.     $data_href->{$phone_number}->{'score'} = $score;
  16. }
  17. close $fh2;

  18. open my $fh3, '<', 'txt3';
  19. open my $fh4, '>', 'txt4';
  20. while (defined (my $line = readline $fh3)) {
  21.     chomp $line;
  22.     my @parts = split /,/, $line, 13;
  23.     my $phone_number = $parts[4];

  24.     $parts[5] = $data_href->{$phone_number}->{'times'} || 0;
  25.     $parts[7] = $data_href->{$phone_number}->{'score'} || 0;

  26.     my $new_line = join ',', @parts;
  27.     print {$fh4} "$new_line$/";
  28. }
  29. close $fh3;
  30. close $fh4;


  31. __END__
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
3 [报告]
发表于 2016-08-18 20:01 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($first, %hData) = "";
  5. while (<>){
  6.     chomp;
  7.     my @aList = split (/,/, $_, -1);
  8.     if (@ARGV){
  9.         $first = $ARGV if ($first eq "");
  10.         my @aT = ($aList[-1], 0);
  11.         if ($first eq $ARGV){
  12.             push (@{$hData{$aList[0]}}, @aT);
  13.         }else{
  14.             my $has = exists $hData{$aList[0]};
  15.             push (@{$hData{$aList[0]}}, $has ? @aT : (0, 0, @aT));
  16.         }
  17.         next;
  18.     }
  19.     if (exists $hData{$aList[4]}){
  20.         my @aT = @{$hData{$aList[4]}};
  21.         @aList[5 .. 8] = @aT > 2 ? @aT : (@aT, 0, 0);
  22.     }
  23.     print join (",", @aList), "\n";
  24. }
复制代码
perl abc.pl a b c
-------------------------------------------------------------------
xa,1,张三,男,13288888888,1,0,200,0,,,,
sh,2,李四,男,13288888889,7,0,0,0,,,,
sh,3,王五,女,13288888890,0,0,5000,0,,,,
bj,4,毛六,男,13288888891,0,0,0,0,,,,

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
4 [报告]
发表于 2016-08-18 20:23 |只看该作者
如果不是以编程的方式修改 MS Excel 单元格内容的话, 可以使用 LibreOffice 办公套件. 开源, 跨平台.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2016-08-18 23:42 |只看该作者

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. use v5.16;
  5. use autodie;
  6. use Data::Dumper;

  7. sub load_data1 {
  8.   local @ARGV = @_;

  9.   my %records;
  10.   while (<>) {
  11.     chomp;
  12.     my ($k, $v) = split /\s*,\s*/;
  13.     $records{$k} = $v;
  14.   }

  15.   return wantarray ? %records : \%records;
  16. }

  17. sub load_data2 {
  18.   local @ARGV = @_;

  19.   my @records;
  20.   while (<>) {
  21.     chomp;
  22.     push @records, [split /\s*,\s*/, $_, -1];
  23.   }

  24.   return wantarray ? @records : \@records;
  25. }

  26. ###

  27. die "Usage: $0 txt1 txt2 txt3" unless @ARGV >= 3;

  28. my $records1 = load_data1 $ARGV[0];
  29. my $records2 = load_data1 $ARGV[1];
  30. my $records3 = load_data2 $ARGV[2];

  31. foreach (@$records3) {
  32.   my $id = $_->[4];
  33.   $_->[5] = $records1->{$id} if exists $records1->{$id};
  34.   $_->[7] = $records2->{$id} if exists $records2->{$id};

  35.   say join(',', @$_);
  36. }
复制代码

论坛徽章:
1
金牛座
日期:2014-03-21 18:22:34
6 [报告]
发表于 2016-08-22 08:45 |只看该作者
谢谢楼上各位大神的解决方案,好久没写代码,都忘了sub了,哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP