我试图了解PERL程序的错误。我有一个以逗号分隔的文件,我想将每行的内容提取到一个单独的文本文件中,使用每行中第一个字段的内容作为文件名。
下面的程序正是这样做除了它跳过csv文件的第一行。我试图通过添加几个打印命令来确定错误的来源。第22行的打印命令显示第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;
答案 0 :(得分:5)
在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";
这个模块很酷,它允许您通过访问数组中的索引来访问文件的行。如果你的文件很大,它的效率并不高,但我认为你肯定可以在这里使用它。