使用perl从csv读取单个列

时间:2014-02-08 08:26:50

标签: perl csv

文件包含以下数据:

S_No        S_Name          Acc_Num     Total_Amount
1            Larry            1521          18000           

为了这个目的,为了从csv读取一列,我编写了这个脚本:

#!/usr/bin/perl -w
use strict;
use warnings;

use Text::CSV;
my$column_separator = qr/,/;
my $column_number = "3";
my$file = "/home/Admin/Documents/new (copy).csv";
open(my$FILE,">>","$file") or die "$!";
while (<$FILE>){
  my @columns = split(/$column_separator/);
  print $columns[$column_number] ,"\n";
}
close $FILE;

但是这个脚本引发了一个错误。

Use of uninitialized value in print at another.pl line 12, <$FILE> line from 1 to 11..

如何解决此错误?

1 个答案:

答案 0 :(得分:1)

错误消息表示该列为空。这就是它未定义的原因。您需要添加一个检查并处理它为空的情况。你可以用两种方式做到这一点:

  • 添加条件,而不是输出空列

    print $columns[$column_number], "\n" if $columns[$column_number];
    
  • 如果未定义值,则输出空行

    print( ( $columns[$column_number] // q{} ), "\n");
    

以下是一些评论:您use正在使用Text :: CSV,但之后您没有使用它来阅读任何内容。

您所做的是逐行读取文件,但您需要添加和更改一些内容:

  • open来电的模式从>>更改为<,因为>>表示追加,但您希望读取
  • chomp删除尾随换行符的输入

所有这些都会产生以下代码。

open(my $FILE,">>","$file") or die "$!";
while (<$FILE>) {
  chomp;
  my @columns = split(/$column_separator/);
  print ( $columns[$column_number] // q{} ), "\n";
}

您还应该阅读Text::CSV并学会使用它,因为它将有助于解决CSV文件的许多常见问题。