使用Perl删除字符串末尾的尾随逗号

yws3nbqq  于 2022-11-15  发布在  Perl
关注(0)|答案(4)|浏览(216)

我正在解析一个CSV文件,其中每一行看起来如下所示。
10998、4499、SLC 27 A5、Q9 Y2 P5、执行编号:0000166、执行编号:0032403、执行编号:0005524、执行编号:0016874、执行编号:0047747、执行编号:0004467、执行编号: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;
}
w80xi6nr

w80xi6nr1#

我会用juanrpozo的解决方案来计算,但是如果你仍然想用你的方法,那么用正则表达式替换去掉逗号。

$line =~ s/,+$//;
yzuktlbb

yzuktlbb2#

我建议用这种更简洁的方式编写程序。
请注意,行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;
}
jbose2ul

jbose2ul3#

可以将grep应用于@array

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

假设$array[0]永远不会与/^GO:/匹配

camsedfj

camsedfj4#

对于每行:

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";
}

相关问题