免费注册 查看新帖 |

Chinaunix

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

寻求文件处理问题,根据表头处理文件问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-18 17:28 |只看该作者 |倒序浏览
本帖最后由 dida2000 于 2012-06-18 17:37 编辑

文件格式为:
no_ext,jpg,swf,png,zip,xml,EXE,mp3,jsp,kprar,
12,2170772,148620,401807,98198,18612,8504,300,4,1,
no_ext,dat,html,1 ,xml,php ,bin,
2337488,58234,27,9,4,1,1,
no_ext,swf,jpg,xml,cab,
1459109,1832,2,3,1,
no_ext,cab,ini,exe,png,zip,jpg,txt,z,7z,dd,ico,php ,
675,1333487,8949,52260,658,549,154,11,76,60,1,5,1,
no_ext,fcg,xml,jpg,php,js,
22,1286870,4,1,2,1,

格式解释:
第一行为表头部分,第二行为数据部分,两行为一个整体。
要求:
把ext,dat,cab分别放到第二~第四个域中,并且用逗号分隔,第一行只有表头,其他行只是数据,不没有内容的部分,用0表示。
最后效果如下:
no_ext,exe,dat,cab
12,8504,0,0
2337488,58234,0,0
1459109,0,0,1
675,52260,0,1333487
22,0,0,0
求perl处理程序。谢谢

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
2 [报告]
发表于 2012-06-18 21:13 |只看该作者
  1. #!/usr/bin/env perl

  2. use strict;
  3. use warnings;

  4. use List::MoreUtils qw( first_index );

  5. my @names = qw( no_ext exe dat cab );
  6. my %hash;

  7. @hash{@names} = ([], [], [], []);

  8. while (1) {
  9.     last if not defined(my $line1 = <DATA>);
  10.     last if not defined(my $line2 = <DATA>);
  11.     my @headers = split /,/, $line1;
  12.     my @datas = split /,/, $line2;
  13.     for my $key (keys %hash) {
  14.         my $val = 0;
  15.         my $i = first_index { lc($_) eq $key } @headers;
  16.         if ($i >= 0) {
  17.             $val = $datas[$i];
  18.         }
  19.         push @{$hash{$key}}, $val;
  20.     }
  21. }

  22. foreach my $name (@names) {
  23.     print "$name\t\t";
  24. }
  25. print "\n";

  26. foreach my $i (0..4) {
  27.     foreach my $key (@names) {
  28.         print "$hash{$key}->[$i]\t\t";
  29.     }
  30.     print "\n";
  31. }

  32. __DATA__
  33. no_ext,jpg,swf,png,zip,xml,EXE,mp3,jsp,kprar,
  34. 12,2170772,148620,401807,98198,18612,8504,300,4,1,
  35. no_ext,dat,html,1 ,xml,php ,bin,
  36. 2337488,58234,27,9,4,1,1,
  37. no_ext,swf,jpg,xml,cab,
  38. 1459109,1832,2,3,1,
  39. no_ext,cab,ini,exe,png,zip,jpg,txt,z,7z,dd,ico,php ,
  40. 675,1333487,8949,52260,658,549,154,11,76,60,1,5,1,
  41. no_ext,fcg,xml,jpg,php,js,
  42. 22,1286870,4,1,2,1,
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-06-18 21:55 |只看该作者
感谢,我先试试

论坛徽章:
0
4 [报告]
发表于 2012-06-18 23:06 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @head = qw(no_ext exe dat cab);
  5. my %data;
  6. while (defined(my $line1 = <DATA>)) {
  7.         my $line2 = <DATA>;
  8.         chomp($line1,$line2);

  9.         my %fields_of;
  10.         @fields_of{ map { lc } split /,/,$line1 } = split /,/,$line2;
  11.        
  12.         for my $h (@head) {
  13.                 push @{ $data{$h} },$fields_of{$h} || 0;
  14.         }
  15. }

  16. print join(",",@head),"\n";
  17. for my $i (0 .. $#{ $data{ $head[0] } }) {
  18.         print join(",",map { $data{$_}[$i] } @head),"\n";
  19. }

  20. __DATA__
  21. no_ext,jpg,swf,png,zip,xml,EXE,mp3,jsp,kprar,
  22. 12,2170772,148620,401807,98198,18612,8504,300,4,1,
  23. no_ext,dat,html,1 ,xml,php ,bin,
  24. 2337488,58234,27,9,4,1,1,
  25. no_ext,swf,jpg,xml,cab,
  26. 1459109,1832,2,3,1,
  27. no_ext,cab,ini,exe,png,zip,jpg,txt,z,7z,dd,ico,php ,
  28. 675,1333487,8949,52260,658,549,154,11,76,60,1,5,1,
  29. no_ext,fcg,xml,jpg,php,js,
  30. 22,1286870,4,1,2,1,
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2012-06-19 00:58 |只看该作者
本帖最后由 yinyuemi 于 2012-06-19 01:18 编辑

  1. perl -MData::Dumper -nle 'BEGIN{@title=qw/no_ext exe dat cab/;print join ",", @title};
  2. $i=0;
  3. if(/^\D/){map{$hash1{++$i}=$_}split /,/, lc($_)}
  4. else{map{$hash2{$hash1{++$i}}=$_} split /,/;
  5. print join ",", map{$_+0} @hash2{@title};
  6. undef %hash1; undef %hash2;
  7. }' file

复制代码

论坛徽章:
0
6 [报告]
发表于 2012-06-19 09:17 |只看该作者
谢谢!
可能我没说清楚,里面需要把大小写的内容都统计一下,还有逗号之间可能有前后空格。
就我举的例子中,第一组中exe是大写的,

论坛徽章:
0
7 [报告]
发表于 2012-06-19 16:27 |只看该作者
请问
push @{ $data{$h} },$fields_of{$h}  

这是什么意思?   

论坛徽章:
0
8 [报告]
发表于 2012-06-19 16:51 |只看该作者
yizhengming 发表于 2012-06-19 16:27
请问
push @{ $data{$h} },$fields_of{$h}  

这个有点像堆栈的调子,push从数组中取出数据

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
9 [报告]
发表于 2012-06-19 19:26 |只看该作者
我试试:
  1. #!/usr/bin/perl

  2. use 5.014;
  3. say join ',', my @p = qw/no_ext exe dat cab/;
  4. while (<DATA>) {
  5.     my %h;
  6.     @h{ map { lc } /\w+/g } = <DATA> =~ /\d+/g;
  7.     say join ',', map { $_ ||= 0 } @h{@p};
  8. }
  9. __DATA__
  10. no_ext,jpg,swf,png,zip,xml,EXE,mp3,jsp,kprar,
  11. 12,2170772,148620,401807,98198,18612,8504,300,4,1,
  12. no_ext,dat,html,1 ,xml,php ,bin,
  13. 2337488,58234,27,9,4,1,1,
  14. no_ext,swf,jpg,xml,cab,
  15. 1459109,1832,2,3,1,
  16. no_ext,cab,ini,exe,png,zip,jpg,txt,z,7z,dd,ico,php ,
  17. 675,1333487,8949,52260,658,549,154,11,76,60,1,5,1,
  18. no_ext,fcg,xml,jpg,php,js,
  19. 22,1286870,4,1,2,1,
复制代码

论坛徽章:
0
10 [报告]
发表于 2012-06-19 19:38 |只看该作者
dida2000 发表于 2012-06-19 16:51
这个有点像堆栈的调子,push从数组中取出数据


push是压入数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP