免费注册 查看新帖 |

Chinaunix

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

请教提取信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-05-16 22:50 |只看该作者 |倒序浏览
大家好!小白请教一个提取信息的问题,
文件如下:

AAAA
112ASDFGH

[USE]
Time: Mon.13
user: James
detail: xxxx

[USE]
Time: June.01
user: Dan
AA
BBB

(Time: 和 user: 后面有空格)
希望通过[USE]关键字提取绿色部分的信息,tab分隔得到:
Mon.13    James
June.01    Dan


论坛徽章:
0
2 [报告]
发表于 2017-05-17 00:59 |只看该作者
楼主这样:
首先,读入整个文件到$mydoc;
然后,@mysec=split("[USE]",$mydoc);  #就是用[USE]把真个文件分为多个片段。
再 foreach $sec(@mysec)
{
  if(  $sec=~ m/Time.+)/)  #或许要  =~ m/Time.+)$/
{
    $neettime= $1;
}

if(  $sec=~ m/user.+)/)  #或许要  {
    $needuser= $1;
}
$res=$neettime.$needuser;



}

论坛徽章:
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 [报告]
发表于 2017-05-17 10:12 |只看该作者
  1. import io.Source
  2. import util.matching.Regex

  3. var ok = false
  4. var n = 0
  5. val matching = new Regex(raw"\A(?:Time|user)")
  6. for(s <- Source.fromFile(args(0)).getLines){
  7.         if(s.startsWith("[USE]")){
  8.                 if(n > 0) println("")
  9.                 ok = true
  10.                 n = 0
  11.         }else{
  12.                 if(ok){
  13.                         val lst = s.split(": ")
  14.                         val v = matching.findFirstIn(lst(0))
  15.                         if(v.isDefined)        print(s"${lst(1)}\t")
  16.                         n += 1
  17.                         ok = n <= 2
  18.                 }
  19.         }
  20. }
复制代码


评分

参与人数 1信誉积分 +10 收起 理由
rubyish + 10 3 Q ~ ~

查看全部评分

论坛徽章:
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 [报告]
发表于 2017-05-17 10:24 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @aData = ();
  5. my $ok = 0;
  6. while(<DATA>){
  7.         chomp;
  8.         if(/\A\[USE]/){
  9.                 print(join("\t", splice(@aData, 0)), "\n") if(@aData);
  10.                 $ok = 1, next;
  11.         }
  12.         push(@aData, $1) if(/\A(?:Time|user):\s+(.*)/);
  13. }
  14. print(join("\t", splice(@aData, 0)), "\n") if(@aData);

  15. __DATA__
  16. [USE]
  17. Time: Mon.13
  18. user: James
  19. detail: xxxx

  20. [USE]
  21. Time: June.01
  22. user: Dan
  23. AA
  24. BBB
复制代码


Scala 没有 next 操作符 太操蛋了。

论坛徽章:
0
5 [报告]
发表于 2017-05-17 10:48 |只看该作者

perl?你这用的什么语言啊?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2017-05-17 12:06 |只看该作者
回复 1# Eva326

$ perl get_key.pl
    Usage  : get_key.pl Segment file
    Example: get_key.pl USE FILE
   
    ---- file: FILE ---------
    [USE]
    Time: Mon.13
    user: Dan


$ perl get_key.pl USE FILE
Mon.13    James
June.01    Dan


$ cat get_key.pl
use strict;
use warnings;

sub message{
  print<<EOF;
    Usage  : $0 Segment file
    Example: $0 USE FILE
   
    ---- file: FILE ---------
    [USE]
    Time: Mon.13
    user: Dan
   
EOF
  exit(1);
}

message() if(@ARGV < 2);
my $sKey = shift;

my $sSeg = "";
my %hSeg = ();
while(<>){
  s/^\s+|\s+$//g;
  #chomp;
  if(m/^\[/){
    if($sSeg eq $sKey){
      print "$hSeg{Time}\t$hSeg{user}\n";
    }
    s/^\[|\]\s*//g;
    $sSeg = $_;
    %hSeg = ();
  }
  else{
    my($sKey, $sVal) = split(/\s*:\s*/, $_, 2);
    if(defined $sVal){
      $hSeg{$sKey} = $sVal;
    }
  }
}

if($sSeg eq $sKey){
  print "$hSeg{Time}\t$hSeg{user}\n";
}


论坛徽章:
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
7 [报告]
发表于 2017-05-17 17:03 |只看该作者
回复 5# hztj2005
Scala 啊。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP