美文网首页
Perl文本处理

Perl文本处理

作者: Forfunnys | 来源:发表于2017-05-27 21:25 被阅读0次

    Perl文本处理

    前几天有个同事请教我安装R的事,然后我甩给他一个R包让他自己去安装。最后因为服务器权限不足,没有安装成功。然后我问了一下是需要什么功能,原来是需要将几个文件整合到一起,我一想,这个perl不就可以解决了。接下来我要安利一下perl强大的文本处理能力了。

    首先,假设我有很多个文件,格式如下:

    现在我需要整合这几个文件,最终格式如下:

    0和1分别表示在对应文件中存在与否(当然也可以是对应文件中的表达值)。

    大家第一时间肯定会想到用哈希表,但是怎么用呢?每个文件设置一个哈希?这个太傻了,而且如果文件很多,那可怎么办….那么用数组,但是数组怎么区分每一行呢?说到这里,可能大家都知道了,没错,用哈希数组。

    大概思路是这样的,每当第i个文件的某一行时,检测是否有name对应的哈希key,如果没有,设置以这个name为哈希key的哈希数组为0数组。然后将这个数组的第i个值设置为1就好了。

    闲话少说,看代码(注意加粗字体):

    use warnings;

    use strict;

    my %hash=();

    my @tmp=(0)x@ARGV;

    for(my $i=0;$i<@ARGV;$i++){

    open IN,$ARGV[$i];

    while(){

    chomp;

    my @sArr=split(/\t/,$_);

    unless(exists $hash{$sArr[0]}){

    @{$hash{$sArr[0]}}=@tmp;

    }

    $hash{$sArr[0]}[$i]=1; }

    close IN;

    }

    foreach my $key(keys %hash){

    print join("\t",$key,@{$hash{$key}})."\n"; }

    是不是很简单,所以一般涉及到文本处理我一般都是先用perl处理好,之后再用R进行其它计算或者画图。

    下面再安利一段添加千分符的程序,

    use strict;

    use warnings;

    my $input =shift;

    my $output=shift;

    open IN,$input;

    open OUT,">$output";

    while(my $line=){

    if($line=~s/(\d+.{0,1}\d+)/&separate($1)/eg);

    print OUT $line;

    }

    sub separate{

    my $number=$1;

    if(substr($number,0,1)==0){return $number;}

    if($number=~m/./){

    return $number;

    }

    if(length($number)>3){

    my $l=length($number);

    my $i=int $l/3;

    my $j=$l%3;

    my $newnum="";

    my $h=substr($number,0,$j);

    for(;$i>0;$i--){

    if($j!=0){$newnum=$newnum.$h.",";}

    $h=substr($number,$j,3);

    $j+=3;

    }

    $newnum=$newnum.$h;

    return $newnum;

    }

    else{return $number;}

    }

    close(IN);

    close(OUT);

    这个代码是我刚做生信的时候做的,思路也不难,首先通过这一段程序识别数字序列(纯数字或带小数点),然后对是别人到的数字系列进行处理(也就是添加千分符),先得到数字系列长度对3取模(字符处理位置)和取余数(循环次数),最后就是在循环里面用substr把千分符加进去而已,思路很简单,具体还是看代码吧。

    perl强大的模式匹配以及好用的哈希结构,是很好的数据处理语言,特别是生信分析中涉及到的大量的匹配和数据提取整合等工作。

    相关文章

      网友评论

          本文标题:Perl文本处理

          本文链接:https://www.haomeiwen.com/subject/vmgqfxtx.html