搜索
查看: 2186|回复: 1

[Perl] perl第12题,代码全注释(抛砖引玉)--(json文件格式化)

[复制链接]

16

主题

61

帖子

519

积分

高级会员

Rank: 4

积分
519
发表于 2017-7-3 00:07:32 | 显示全部楼层 |阅读模式
本帖最后由 泥土 于 2017-7-3 01:03 编辑

json文件在网络中搜索一下,有很多介绍,在此不多说了,但是有一点用Perl解题核心就是解引用,嵌套(数组,哈希)相互嵌套,下面是代码,这个是我综合了一个师兄和自己理解改造的代码。输入文件见此链接http://www.biotrainee.com/thread-1355-1-1.html
[Perl] 纯文本查看 复制代码
use JSON;
use Data::Dumper;
print "technique\tfactor\t target\tprincipal_investigator\tsubmission\tlabel\tcategory\ttype\tDevelopmental-Stage\torganism\tkey\n";
my $file = './modencodeMetaData.json';#文件句柄
my $data = `cat $file`;#读取数据注意这里是反向单引号  ` `,也就是数字1前面那个按键,在Linux环境下运行哈
#print $data."\n";#自己测试时用的
my $data  = decode_json $data;#应用decode_json函数
#print Dumper $data;这个也是自己此时用的
foreach $item (@{$data->{items}}){#这个数据结构整体式大hash,但是里面有两个键typeset和items
                                                                                                                                        #而items对于的有是一个大数组@@{$data->{items},数组里的元素是小hash,这是它的整体结构                        
                                                                                                                                        #        建议好好看看解引用和嵌套,我也看了好几天才明白-_-             foreach (@{$item->{Tracks}}){ 
        print $item->{'technique'}."\t";#循环变量$item相当于每个小的hash的引用,然后再用指向键就可以
        print $item->{'factor'}."\t";
        print $item->{'target'}."\t";
        print $item->{'principal_investigator'}."\t";
        print $item->{'submission'}."\t";
        print $item->{'label'}."\t";
        print $item->{'category'}."\t";
        print $item->{'type'}."\t";
        print $item->{'Developmental-Stage'}."\t";
        print $item->{'organism'}."\t";
         print "$_\n";
          }                                           #这个是Tracks行,它对应的是数组,所以再解一次,
                                                   
                                                     
       
}                

输出文件,请大家详细的看一下红圈部分,一个是原文件,一个是输出,而比对http://www.biotrainee.com/thread-1355-1-1.html中的Perl代码的输出,是有问题的,请大家详细比对,也就是Tracks 部分与label,部分弄混了。原因在此部分

[Perl] 纯文本查看 复制代码
for my $item ( @{$data->{items}} ) {
    $item->{key} = $item->{label};
    no warnings 'uninitialized';
    for my $track ( @{$item->{Tracks}} ) {
        $item->{label} = $track;
        say join ',', map "\"$_\"", @{$item}{@fields};
    }

而这部分,有的代码我暂时无法理解,尤其是@{$item}{@fields},希望大神们给予注释,或者这部分的名称,这样方便查阅资料学习。


输出

输出

原文件

原文件



上一篇:pyhton基础
下一篇:repeatscout第三步没有输出结果如何解决?
回复

使用道具 举报

16

主题

61

帖子

519

积分

高级会员

Rank: 4

积分
519
 楼主| 发表于 2017-7-4 01:05:02 | 显示全部楼层
本帖最后由 泥土 于 2017-7-5 23:44 编辑

json文件还是很常用的一个文件格式,为了锻炼自己提前json文件的能力,今天又琢磨了好久这个文件,上面是老早之前下载的一个json文件(见附件),提前其中的临床信息,今天反复尝试终于搞出来了,希望大家分享更简洁易懂的代码,但是通俗易懂优先哈,下面写代码
[Perl] 纯文本查看 复制代码
use JSON;
use Data::Dumper;
print "entity_submitter_id\ttumor_stage\tage_at_diagnosis\tvital_status\n";
my $file = './tcga.json';
my $data = `cat $file`;
#print Dumper $data."\n";
my $data  = decode_json $data;
#print Dumper $data;
foreach $a (@$data){
        foreach $b (@{$a->{'associated_entities'}}){  #分清json的结果,有一层就解一层大家可以尝试
                                                            #这个和第一差不多,思路是一样的,帖子中第一个是
                                                            #主体hash嵌套数组,这个是数组嵌套hash,反复进行
                                                            #规矩应该是1对1就hash,1对多,array。
                print $b->{'entity_submitter_id'}."\t";
                foreach $c (@{$a->{'cases'}}){
                        foreach $d (@{$c->{'diagnoses'}}){
                                print $d->{'tumor_stage'}."\t";
                                print $d->{'age_at_diagnosis'}."\t";
                                print $d->{'vital_status'}."\n";
                                
                        }
                }
        }
}



输出文件

结果

结果

tcga.rar

57.75 KB, 下载次数: 1

tcga.json.rar

回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-11-17 19:27 , Processed in 0.035767 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.