【问题标题】:Read a file from second line till end in perl在perl中从第二行读取文件直到结束
【发布时间】:2014-03-03 10:16:44
【问题描述】:

我有一个包含这么多行的文件。我想丢弃第一行和 试图从第二行读取文件直到结束,但在谷歌上没有得到足够的帮助。 在这种情况下请帮助我。

下面是我试图提取 csv 文件的第 4 列和第 5 列的代码,但是它也包括我不想要的标题的第一行。

我的代码应该只给我值而不是标题。从第二行开始。

foreach my $inputfile (glob("$previous_path/*Analysis*.txt")) {
open(INFILE, $inputfile) or die("Could not open  file.");
foreach my $line (<INFILE>){
my @values = split(',', $line); # parse the file
my $previous_result = $values[5];
my $previous_time = $values[4];
print $previous_result,"\n";
print $previous_time,"\n";
push (@previous_result, $previous_result);
push (@previous_time, $previous_time);
    }
close(INFILE);
}

【问题讨论】:

  • 非常简单的将文件放入数组并从array[1]打印该数组
  • @Ram: 这是一个糟糕的解决方案
  • scalar &lt;$fh&gt; 将读取一行,然后您可以随意丢弃。
  • @Dan Dascalescu 那么最好的方法是什么?
  • @Ram:这需要将整个文件读入内存,user2503377 曾说过“有这么多行”——效率极低。

标签: perl


【解决方案1】:

跳过第一行,然后阅读其余部分。

<>;                # read and discard a line
while (<>) {       # loop over the other lines
    print $_
}

更新:在你 edited the question 之后,你想要一些完全不同的东西,

在 Perl 中读取 CSV 文件

这是一个完全不同的问题,你应该首先问什么。答案是使用已建立的库,例如CSV::Slurp

【讨论】:

  • 它给出包含的第一行 open my $fh, ' ) { 打印 $_; }
  • @user2503377 该代码不像答案中的代码那样包含&lt;$fh&gt;
【解决方案2】:

只需跳过行号 ($.) 1,可能使用 next,如下所示:

while (<>) {
    next if ($. == 1);
    print $_;
}

Live demo.

【讨论】:

  • 这将不必要地测试脚本是否正在读取第一行。并不是说它真的很重要,因为瓶颈是文件系统,但为什么不只是read and discard the first line beforehand?。
  • @DanDascalescu:你的回答可能会更有效,+1。
【解决方案3】:

你可以在读取文件时跳过第一行

例如

open(IN,"cat filename|tail -n +2|") || die "can not open file :$!";
while(<IN>){
     //process further
}
close(IN);

【讨论】:

  • 这是在 Perl 中跳过处理文件第一行的低效方法的参赛作品吗?如果是这样,你赢了与 Naghaveer 和 Ram。
  • 当在 Perl 中完全可以使用系统调用时,为什么还要使用它呢?对于学习 Perl 的人来说,这是一个常见的错误,因为他们不知道要加载哪些模块才能获得某种功能。在这种情况下,根本不需要模块。请查看其他答案,尤其是 Dan 和 John 的答案。另外,请花时间格式化您的答案并使用标点符号。我知道 Perl 本身有很多标点符号,但英语也应该有。
猜你喜欢
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
相关资源
最近更新 更多