免费注册 查看新帖 |

Chinaunix

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

文件以矩阵的形式输出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-25 17:56 |只看该作者 |倒序浏览
文件有6 列= (序号、学校、学科、年限、发文数、引文数)。如

  1. 1  北京师范大学  基础科学 2005 624 4437
  2. 2  北京师范大学  基础科学 2006 725 6543
  3. 3  北京师范大学  基础科学 2007 685 8969
复制代码
=======================================
  1. use v6;
  2. sub MAIN(Str $files) {
  3.     my %hash_paper;
  4.     my %hash_cited;
  5.     my $file-path = IO::Path.new($files);
  6.     if (!($file-path.e && $file-path.r)) {
  7.          say "Config file not exist path -> $file-path";
  8.          exit
  9.      }
  10.      my @lines = $file-path.lines;
  11.      for @lines {
  12.          my ($, $univ, $dis, $year, $paper, $cited) = .words;

  13.          try {
  14.              %hash_paper{$year}{$univ}{$dis} += $paper;
  15.              %hash_cited{$year}{$univ}{$dis} += $cited;
  16.              }
  17.              CATCH {
  18.                  default {
  19.                      next;
  20.                  }
  21.              }
  22.          }
  23.      }

  24.     my @times = %hash_paper.keys.sort();
  25.      for @times -> $t {
  26.          # i dont know how to do
  27.       }
  28. }
复制代码
我想把文件(见附件),按每年以矩阵的形式输出(一个发文数矩阵、一个引文数
矩阵)


data.rar (8.77 KB, 下载次数: 13)

论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
2 [报告]
发表于 2015-10-25 18:57 |只看该作者
来个笨的!

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

  3. my $data={};
  4. while (my $line=<DATA>){
  5.         if($line){
  6.                 my ($univ,$dis,$year,$paper,$cited)=(split /\s+/,$line)[1..5];
  7.                 $data->{$univ}->{$year}->{$dis}=[$paper,$cited];
  8.         }
  9. }

  10. foreach my $uni(sort keys %{$data}){
  11.         print "学校\t";
  12.         foreach  my $yea(sort {$a<=>$b}keys %{$data->{$uni}}){
  13.                 foreach my $dis(keys %{$data->{$uni}->{$yea}}){
  14.                         print "$dis\t";
  15.                 }
  16.         }
  17.         print "\n";
  18.         last;
  19. }

  20. foreach my $uni(sort keys %{$data}){
  21.         print "$uni\t";
  22.         foreach  my $yea(sort {$a<=>$b}keys %{$data->{$uni}}){
  23.                 foreach my $dis(sort keys %{$data->{$uni}->{$yea}}){
  24.                         print "$data->{$uni}->{$yea}->{$dis}->[0]\t";                  #[0]发文数,[1]为引用数
  25.                 }
  26.         }
  27.         print "\n";
  28. }

  29. __DATA__
  30. 1        北京师范大学        基础科学        2005        624        4437
  31. ……
复制代码

论坛徽章:
0
3 [报告]
发表于 2015-10-25 23:09 |只看该作者
仿照楼上的写了一个,我的可读性很差
  1. use v6;
  2.     my ( $da, @cnki ) = $=finish.lines;
  3.     my %hash;
  4.     my (@yy,@uu,@dd);
  5.     for @cnki {
  6.          my ($, $univ, $dis, $year, $paper, $cited) = .words;
  7.            %hash{$year}{$univ}{$dis} = [ $paper, $cited];  
  8.          }


  9.          ##
  10.          @yy = %hash.keys.sort;
  11.              for @yy -> $y {
  12.                      @uu= %hash{$y}.keys.sort;
  13.                      for @uu -> $u {            
  14.                      @dd= %hash{$y}{$u}.keys.sort;
  15.                      }
  16.                  }



  17.       ###
  18.      for @yy -> $y {
  19.              $y.say;
  20.              for @dd -> $d {
  21.                      print "\t $d\t";
  22.                           }

  23.               for @uu -> $u {
  24.                       print "\n$u\t";
  25.                       for @dd -> $d {
  26.                        print "%hash{$y}{$u}{$d}[1]\t";  #[0]发文数,[1]为引用数
  27.                        }
  28.                }
  29.                  print "\n";
  30.       }




  31. =finish
  32. num  univ           dis         year    paper cited     
  33. 1        北京师范大学        基础科学        2005        624        4437
  34. 2        北京师范大学        基础科学        2006        725        6543
  35. 3        北京师范大学        基础科学        2007        685        8969
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
4 [报告]
发表于 2015-10-26 00:17 |只看该作者
本帖最后由 104359176 于 2015-10-26 00:17 编辑

输出的东西是在文本中看起来像矩阵还是要导入到 excel 中?

如果只是在文本格式中列对齐的话,用 sprintf 设置每个字段的对其方式和指定宽度。
  1. for my $records (values $data) {
  2.     sprintf("%10s, %10s, %10s", @{$records});
  3. }
复制代码
如果要导入到 excel 中,字段的输出以 \t 间隔
  1. for my $records (values $data) {
  2.     say join("\t", @{$records});
  3. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2015-10-27 09:05 |只看该作者
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my %tar_output;
  5. my %univ;
  6. my %dis;
  7. open SOUR_FILE, "/home/oracle/data.txt";

  8. while (<SOUR_FILE>)
  9. {
  10.     my $line = $_;
  11.     my @input_line;

  12.     if($line=~/^[0-9]/)
  13.     {
  14.         @input_line = split(/\s/, $line);
  15.         #print $input_line[0],$input_line[1],$input_line[2],$input_line[4],"\n";

  16.         $tar_output{$input_line[1]}{$input_line[2]} += $input_line[4];

  17.         $univ{$input_line[1]} += 1;
  18.         $dis{$input_line[2]} += 1;
  19.     }
  20. }

  21. print " "x15,join " "x5, keys %dis,"\n";
  22. foreach my $univ (sort keys %univ)
  23. {
  24.     printf("%10s", $univ);
  25.     foreach my $dis (sort keys %dis)
  26.     {
  27.         if(defined $tar_output{$univ}{$dis})
  28.         {
  29.               printf("%15d",$tar_output{$univ}{$dis});
  30.         }
  31.         else
  32.         {
  33.               printf("%15d", 0);
  34.         }
  35.     }
  36.     print "\n";

  37. }
复制代码
如果真要打印出一模一样的表格的话,可以用 excel 或在 xml模块
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP