【问题标题】:Perl program skipping first line in csv filePerl 程序跳过 csv 文件中的第一行
【发布时间】:2012-08-23 20:30:01
【问题描述】:

我试图了解 PERL 程序的错误。我有一个逗号分隔的文件,我想将每一行的内容提取到一个单独的文本文件中,使用每一行中第一个字段的内容作为文件名。

下面的程序正是这样做的,只是它跳过了 csv 文件的第一行。我试图通过添加几个打印命令来确定错误的来源。第 22 行的 print 命令显示第一行被第 21 行的命令读取。但是,一旦 foreach 循环开始,第一行就不会打印出来。

我不太确定这个问题。感谢您的帮助!

#!/usr/bin/perl
# script that takes a .csv file (such as that exported from Excel) and 
# extracts the contents of each row into a separate text file, using the first column as the filename
# original source: http://www.tek-tips.com/viewthread.cfm?qid=1516940
# modified 3/14/12
# usage = ./export_rows.pl <yourfilename>.csv

use warnings;
use strict;
use Text::CSV_XS;
use Tie::Handle::CSV;

unless(@ARGV) {
    print "Please supply a .csv file at the command line! For example, export_rows.pl myfile.csv\n";
    exit;
}

my $fh = Tie::Handle::CSV->new(file => $ARGV[0],
                           header => 0);

my @headers = @{scalar <$fh>};
print "$headers[0]\n\n";

foreach my $csv_line (<$fh>) {
    print "$csv_line->[0]\n";
    open OUT, "> $csv_line->[0].txt" or die "Could not open file $csv_line->[0].txt for output.\n$!";
    for my $i (1..$#headers) {
         print OUT "$csv_line->[$i]\n";
    }
    close OUT;
 }

 close $fh;

【问题讨论】:

  • 我猜你的 for 循环需要从 0 开始。
  • @squiguy 回答这个问题,所以我们可以给你点赞。

标签: perl


【解决方案1】:

尝试在你的 for 循环中从 0 开始:

for my $i (1..$#headers)

应该是:

for my $i (0..$#headers)

编辑:

要获取文件的第一行,您可以使用Tie::File

这里是示例代码:

my @arr;
tie @arr, 'Tie::File', 'a.txt' or die $!;
my $first = $arr[0];
untie @arr;

print "$first\n";

这个模块很酷,因为它允许您通过访问数组中的索引来访问文件的行。如果你的文件很大,它的效率不是很高,但我认为你绝对可以在这里使用它。

【讨论】:

  • 这一行控制将行中的哪些字段打印到输出文件。我想将第一个字段用作文件名的一部分,然后提取其余字段,以便该行按原样正确。我认为第一行问题发生在@headers 初始化和 foreach 循环之间。
  • @user1620933 我相信带有菱形运算符的打印循环之前的行会推进第一行,因此下次您从中读取时会跳过它。哪个是 foreach 循环。
  • 这似乎与我观察到的行为一致。不幸的是,我不知道如何解决这个问题。我尝试了一个 seek 命令来“重置”文件,但这不起作用。关于如何让 foreach 循环从文件开头开始的任何建议?
  • @user1620933 我更新了我的答案。如果您需要帮助,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2018-06-12
  • 2020-12-15
  • 2015-09-18
  • 1970-01-01
  • 2014-04-12
  • 2012-06-09
  • 2021-11-11
  • 2014-01-26
相关资源
最近更新 更多