【问题标题】:Remove trailing commas at the end of the string using Perl使用 Perl 删除字符串末尾的尾随逗号
【发布时间】:2012-05-20 22:42:37
【问题描述】:

我正在解析一个 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;
}

【问题讨论】:

  • 在进行拆分之前进行正则表达式替换:
  • 如果您将my $count = my @go = split(/,/, $go) 更改为my $count = my @go = split(/,/, $go, 0) 或只是my $count = my @go = split /,/, $go,那么后面的空字段将被丢弃。

标签: perl csv comma trailing


【解决方案1】:

您可以将grep 申请到@array

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

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

【讨论】:

  • 感谢 juanrpozo。这有帮助。幸运的是 $array[0] 不匹配 GO:
【解决方案2】:

对于你的每一行:

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

【讨论】:

    【解决方案3】:

    我会使用 juanrpozo 的解决方案进行计数,但如果您仍想按自己的方式进行,请使用正则表达式替换删除逗号。

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

    【讨论】:

    • 是的,juanrpozo 的代码解决了这个问题,但问题是删除尾随逗号。对于你给我正确答案的问题。谢谢!
    • {1,} 更好地称为+,而/g 是多余的。这应该写成$line =~ s/,+$//
    • 是的。首先我把它作为{2,},后来我编辑时我不假思索地把它改成了1。你对 g 也是正确的。你的更整洁。
    【解决方案4】:

    我建议使用这种更简洁的方式来编写程序。

    请注意,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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2021-01-25
      • 2013-07-29
      • 2019-01-10
      相关资源
      最近更新 更多