2017-10-31 5 views
0

私は、以下のテーブルを複雑なデータ構造に格納する方法と、どのデータ構造を使用するのかを考えています。入力は、Excelから派生したタブ区切りのテキストファイルです。いくつかのセルが空であることに注意してください(この場合、「RQ Max」)。ここではテーブルがあります:perlでデータ構造にテーブルを格納する

Well Sample Name Target Name RQ Max Ct Mean 
1 Sample 1 actin  20,514 
2 Sample 1 claudin  30,544 
3 Sample 1 occludin  31,183 
25 Sample 1 actin  20,514 
26 Sample 1 claudin  30,544 
27 Sample 1 occludin  31,183 
49 Sample 2 actin  20,416 
50 Sample 2 claudin  25,611 
51 Sample 2 occludin  27,831 
73 Sample 2 actin  20,416 
74 Sample 2 claudin  25,611 
75 Sample 2 occludin  27,831 
97 Sample 3 actin  24,213 
98 Sample 3 claudin  32,065 
99 Sample 3 occludin  34,556 
194 H2O claudin  
195 H2O occludin   
217 H2O actin  
218 H2O claudin  
219 H2O occludin 

、ここでは私のコードは次のとおりです。

​​3210

あなたが見ることができるように、私が使用した構造を確認していないので、私は、私のプログラムの先頭にしています。実際には、テーブル全体のうち、「サンプル名」、「ターゲット名」、「Ct Mean」の3つの列が必要です。後で各サンプルについて何かを計算したいので、これらをキーとして持つと便利です。ハッシュ構造のハッシュでは、「第2のキー」としてターゲット名を使用したいと思います。誰かが私を正しい方向へ押し込んでくれますか?私は長い期間のためにPerlを使用していないと私は現在、これは私が最後にしたいのですが何が...、データの格納と

を苦労しています:

%data = (
      Sample 1 => { 
       actin  => 20.514, 
       claudin  => 30.544, 
       occludin => 31.183, 
      }, 
      Sample 2 => { 
        actin  => 20.416, 
        claudin  => 25.611, 
        occludin => 27.831, 
       }, 
       ... 
); 
+0

を私が編集をお詫び申し上げます。明らかに、SOは投稿のタブ文字を許可しません。ただし、生データを取得するには[回避策](https://meta.stackoverflow.com/a/275946/3600709)があります。 – ctwheels

+0

「サンプル」の後のビットをどのように解析するかは不明ですか? – Sobrique

+0

[Text :: CSV](https://metacpan.org/pod/Text::CSV) – palik

答えて

1

だから、いくつかのポイント - あなたはコマンドラインで指定したファイルから読んでいる場合は - 簡単な速記です:perlのいずれか STDIN またはコマンドラインで指定されたファイルを読み込むを持って

while (<>) { 

。あなたはsed/grepをどうやって使うの?

第2ステップ - ハッシュスライスを使用してタブで区切られた日付を解析できます。

だから、あなただけのCT_Meanの抽出を見ていると仮定すると:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Data::Dumper; 

my %results; 

#read header row 
chomp (my @header = split /\t/, <>); 
#tidy up leading whitespace in the fields (there's some in your example data) 
s/^\s+// for @header; 
#iterate the rest of STDIN or files on command line. 
while (<>) { 
    #remove trailing linefeed. 
    chomp; 
    #tidy up leading whitespace again. 
    s/^\s+//g; 

    my %row; 
    #use hash slice to read key-value. 
    @row{@header} = split /\t/; 
    #print for debug 
    print Dumper \%row; 

    #skip the H2O lines. 
    next if $row{'Sample Name'} eq 'H2O'; 

    #Cosmetic assignments - could rewrite to a single one 
    my $sample_name = $row{'Sample Name'}; 
    my $ct_mean = $row{'Ct Mean'}; 
    my $target_name = $row{'Target Name'}; 

    $results{$sample_name}{$target_name} = $ct_mean; 
} 

print Dumper \%results; 

あなたが与える:

$VAR1 = { 
      'Sample 2' => { 
          'occludin' => '27,831', 
          'actin' => '20,416', 
          'claudin' => '25,611' 
         }, 
      'Sample 3' => { 
          'occludin' => '34,556', 
          'actin' => '24,213', 
          'claudin' => '32,065' 
         }, 
      'Sample 1' => { 
          'claudin' => '30,544', 
          'occludin' => '31,183', 
          'actin' => '20,514' 
         } 
     }; 

(注 - ハッシュが明示的に順序付けられていない)

関連する問題