В файле есть такие данные:

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..

Как исправить эту ошибку?

0
user3269877 8 Фев 2014 в 12:26
2
В программе, которую вы показываете, нет 27 строк. Пожалуйста, покажите ваш реальный код.
 – 
Borodin
8 Фев 2014 в 12:40
Я отредактировал свой вопрос, пожалуйста, посмотрите один раз
 – 
user3269877
8 Фев 2014 в 12:51

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.

1
simbabque 8 Фев 2014 в 12:49
Отображается ошибка print (...) interpreted as function at another.pl line 13. Useless use of a constant in void context at another.pl line 13. Unknown open() mode '' at another.pl line 9.
 – 
user3269877
8 Фев 2014 в 12:48
Print (...) интерпретируется как функция в строке 13 another.pl. Бесполезное использование константы в пустом контексте в строке 13 another.pl.
 – 
user3269877
8 Фев 2014 в 12:53
Я не знаю, что у вас в строке 13.
 – 
simbabque
8 Фев 2014 в 12:54
Теперь работает нормально ... но не извлекает значения третьего столбца
 – 
user3269877
8 Фев 2014 в 12:56
1
Вы устанавливаете свой разделитель на ,, но в вашем примере ввода столбцы выровнены с использованием пробелов ....
 – 
simbabque
8 Фев 2014 в 13:58