如何使用perl删除文件中可用的最后一行

时间:2018-03-19 14:17:05

标签: perl

如何使用perl删除文件中可用的最后一行。

我的数据如下所示。

"A",1,-2,-1,-4,
"B",3,-5,-2.-5,

如何删除最后一行...我在汇总所有数字,但最后收到一个空值。

尝试使用chomp但没有工作。

以下是目前使用的代码:

while (<data>) {
    chomp(my @row = (split ',' , $_ , -1);
    say sum @row[1 .. $#row];
}

3 个答案:

答案 0 :(得分:1)

试试这个(shell one-liner):

perl -lne '!eof() and print' file

或作为剧本的一部分:

while (defined($_ = readline ARGV)) {
    print $_ unless eof();
}

答案 1 :(得分:1)

您应该使用Text::CSVText::CSV_XS来处理逗号分隔值文件。这些模块可在CPAN上使用。这种解决方案看起来像这样:

use Text::CSV;
use List::Util qw(sum);

my $csv = Text::CSV->new({binary => 1})
    or die "Cannot use CSV: " . Text::CSV->error_diag;

while(my $row = $csv->getline($fh)) {
    next unless ($row->[0] || '') =~ m/\w/; # Reject rows that don't start with an identifier.
    my $sum = sum(@$row[1..$#$row]);
    print "$sum\n";
}

如果你遇到一个没有使用正确的CSV解析器的解决方案,那么至少你需要在你的chomp之后立即将它添加到你现有的while循环中:

next unless scalar(@row) && length $row[0]; # Skip empty rows.

此行的要点是检测行何时为空 - 没有元素,或者在chomp之后元素为空。

答案 2 :(得分:0)

我怀疑这是一个X / Y问题。您认为在实际应该确保所有输入数据都是您期望的格式时,您希望避免处理输入中的最终(空?)行。

您可以采取多种措施来检查数据的有效性。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';
use List::Util 'sum';
use Scalar::Util 'looks_like_number';

while (<DATA>) {
  # Chomp the input before splitting it.
  chomp;

  # Remove the -1 from your call to split().
  # This automatically removes any empty trailing fields.
  my @row = split /,/;

  # Skip lines that are empty.
  # 1/ Ensure there is data in @row.
  # 2/ Ensure at least one element in @row contains
  #    non-whitespace data.
  next unless @row and grep { /\S/ } @row;

  # Ensure that all of the data you pass to sum()
  # looks like numbers.
  say sum grep { looks_like_number $_ } @row[1 .. $#row];
}

__DATA__
"A",1.2,-1.5,4.2,1.4,

"B",2.6,-.50,-1.6,0.3,-1.3,