【问题标题】:Perl script can't load CSV filePerl 脚本无法加载 CSV 文件
【发布时间】:2014-05-03 21:55:37
【问题描述】:

我在 Perl 脚本中有一个子例程,它打开一个 csv 文件并将值读入哈希表。该脚本当前在 Windows 2003 服务器上运行没有问题。我试图让脚本在 Windows 2008 R2 服务器上运行。当我在 R2 上运行脚本时,它失败并出现以下错误:Can't locate object method "getLine" via package "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文件?

谢谢, 亚历克斯

【问题讨论】:

    标签: perl perl-module


    【解决方案1】:

    如果您想将文件句柄视为对象,IO::File 模块有时会很有帮助,但通常最好使用 Perl 的原生 open 运算符。

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

    此外,您将哈希元素的值设置为数组引用$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;
    }
    

    【讨论】:

    • 这一行与 OP 的意图不符:$output_hash{$row-&gt;[0]} = $row-&gt;[1];。看起来她有一个值列表,其中第一个是键
    【解决方案2】:

    getline 将文件句柄作为参数,但您传递的是文件 name。改变

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 2014-11-06
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多