Perl脚本无法加载CSV文件

时间:2014-03-25 20:01:23

标签: perl perl-module

我在Perl脚本中有一个子例程,它打开一个csv文件并将值读入哈希表。该脚本当前在Windows 2003服务器上运行时没有问题。我试图让脚本在Windows 2008 R2服务器上运行。当我在R2上运行脚本时,它失败并出现以下错误:无法找到对象方法" getLine"通过包" C:\ file \ test.csv" (也许你忘了加载" C:\ file \ test.csv)

我从包含Perl脚本和csv文件的目录中的命令行运行脚本。我可以使用move()函数重命名csv文件。显然,正在找到csv文件,它只是没有被读取。

sub csv_file_hashref {
   my ($filename) = @_;
   my $csv_fh = IO::File->new($filename, 'r');
   my $csv = Text::CSV_XS->new ();
   my %output_hash;
   while(my $colref = $csv->getline ($filename))
   {
      $output_hash{shift @{$colref}} = $colref;
   }

   return \%output_hash;                        # return a reference to the hash
}

我已确认包含完整目录的正确文件名是$ filename。我确保安装了IO :: File模块。为什么这个代码不会打开csv文件?

谢谢, 亚历克斯

2 个答案:

答案 0 :(得分:5)

getline将文件句柄作为参数,但您要传递文件 name 。变化

while(my $colref = $csv->getline ($filename))

while(my $colref = $csv->getline ($csv_fh))

答案 1 :(得分:2)

如果您希望将文件句柄视为对象,IO::File模块有时很有用,但最好使用Perl的本机open运算符。

如前所述,问题是您在打开文件后没有使用文件句柄:您应该将其传递给Text::CSV getline方法。

此外,您将散列元素的值设置为数组引用$colref,而不是它引用的数组的第二个元素的值。

这是一个整理的子程序版本,并修复了这些点。

sub csv_file_hashref {
   my ($filename) = @_;

   open my $csv_fh, '<', $filename or die qq{Unable to open "$filename" for input: $!};
   my $csv = Text::CSV_XS->new;
   my %output_hash;

   while (my $row = $csv->getline($csv_fh)) {
      $output_hash{$row->[0]} = $row->[1];
   }

   return \%output_hash;
}