3

各行が次のように見える CSV ファイルを解析しています。

10998,4499,SLC27A5,Q9Y2P5,GO:0000166,GO:0032403,GO:0005524,GO:0016874,GO:0047747,GO:0004467,GO:0015245,,,,,,,,,,,,,, 、、、、、、、、、、、、、、、、、、、

各行の終わりにコンマがあるようです。

最初の用語、この場合は「10998」を取得し、それに関連する GO 用語の数を取得します。したがって、この場合の私の出力は、

出力:

10998,7

しかし、代わりに 299 が表示されます。全体として、各行に 303 個のコンマがあることに気付きました。また、末尾のコンマを簡単に削除する方法がわかりません。誰でもこの問題を解決するのを手伝ってもらえますか?

ありがとう!

私のコード:

use strict;
use warnings;

open my $IN, '<', 'test.csv' or die "can't find file: $!";
open(CSV, ">GO_MF_counts_Genes.csv") or die "Error!! Cannot create the file: $!\n";
my @genes = ();

my $mf;
foreach my $line (<$IN>) {
    chomp $line;
    my @array = split(/,/, $line);
    my @GO = splice(@array, 4);
    my $GO = join(',', @GO);
    $mf = count($GO);
    print CSV "$array[0],$mf\n";
}

sub count {
    my $go = shift @_;
    my $count = my @go = split(/,/, $go);
    return $count;
}
4

4 に答える 4

4

カウントにはjuanrpozoのソリューションを使用しますが、それでもやりたい場合は、正規表現置換でコンマを削除してください。

$line =~ s/,+$//;
于 2012-05-12T19:44:06.337 に答える
3

プログラムをコーディングするこのより簡潔な方法をお勧めします。

my @data = split /,/, $lineは末尾の空のフィールド (@dataサンプル データには 11 個のフィールドしかありません) を破棄するため、末尾のカンマが事前に削除されているかどうかに関係なく、同じ結果が生成されることに注意してください。

use strict;
use warnings;

open my $in, '<', 'test.csv' or die "Cannot open file for input: $!";
open my $out, '>', 'GO_MF_counts_Genes.csv' or die "Cannot open file for output: $!";

foreach my $line (<$in>) {
  chomp $line;
  my @data = split /,/, $line;
  printf $out "%s,%d\n", $data[0], scalar grep /^GO:/, @data;
}
于 2012-05-12T23:08:05.010 に答える
2

grepに応募できます@array

my $mf = grep { /^GO:/ } @array;

$array[0]決して一致しないと仮定して/^GO:/

于 2012-05-12T19:23:45.120 に答える
-1

あなたの行ごとに:

foreach my $line (<$IN>) {
    my ($first_term) = ($line =~ /(\d+),/);
    my @tmp = split('GO', " $line ");
    my $nr_of_GOs = @tmp - 1;
    print CSV "$first_term,$nr_of_GOs\n";
}
于 2012-05-12T19:43:27.647 に答える