Как читать CSV и отслеживать, где изменяется определенное значение

#perl #csv

#perl #csv

Вопрос:

У меня есть файл CSV:

 Name,Week,Planned,Passed
AST,01,5,8
KST,01,9,14
RST,01,76,23
AST,02,12,45
KST,02,5,4
RST,02,13,65
GST,02,76,12
LST,03,12,43
AST,04,54,34

  

Я читаю из этого файла и заполняю HTML-файл Perl на основе информации в CSV:

 while (!eof(FH)) { //while csv file is opened


my $line = <FH>;

chomp $line;

my($name,$week,$planned,$passed) = split(",", $line);

$currentHash{$name}{"week"} = $week;
$currentHash{$name}{"week"} = $planned;
$currentHash{$name}{"week"} = $passed;

$datafile = area/${week}/test.html

open my $fh, ">", $datafile;

if ($week != "Week") {

push @weekArray, qq( <td aligh=center bgcolor=#FFFFF font size='2'>$name</td>n);

push @weekArray, qq( <td aligh=center bgcolor=#FFFFF font size='2'>$week</td>n);

push @weekArray, qq( <td aligh=center bgcolor=#FFFFF font size='2'>$planned</td>n);

push @weekArray, qq( <td aligh=center bgcolor=#FFFFF font size='2'>$passed</td>n);


} //end of if

print $fh @weekArray;
close $fh

} //end of while

  

Этот код успешно создает таблицу с информацией о файле CSV. Однако он не создает таблицу, которая создает символ новой строки после нового week .

Мне трудно понять, как определить, когда начинается новая неделя, потому что все это находится внутри цикла.

Когда я читаю файл, я хочу помещать символ новой строки каждый раз, когда меняется номер недели. Мне также нужно сделать это без жесткого кодирования для определенной недели, потому что номер недели произвольный.

Как я хочу, чтобы таблица выглядела:

 Name,Week,Planned,Passed
AST,01,5,8
KST,01,9,14
RST,01,76,23

AST,02,12,45
KST,02,5,4
RST,02,13,65
GST,02,76,12

LST,03,12,43

AST,04,54,34

  

Комментарии:

1. Введите дополнительную переменную. Проверьте, отличается ли текущая неделя чтения от той, что указана в этой переменной. Если это так, вставьте пустые ячейки в массив и установите переменную на текущую неделю чтения.

2. Пожалуйста, опубликуйте фактический исполняемый код Perl. Комментарии начинаются с # в Perl, а не // . Кавычки отсутствуют area/${week}/test.html . Что касается некоторых допущенных вами ошибок: $week != "Week" следует использовать ne вместо != (этот тест пока работает, но не по той причине, по которой вы думаете). Наконец, вы пишете Perl, а не C, поэтому вы должны делать while (my $line = <FH>) , а не свои !eof(FH) вещи (и использовать лексический дескриптор файла $FH , а не глобальный FH ).

3. @FranceMadrid Важное предложение: добавьте use warnings; и use strict в начале и следуйте сообщениям, чтобы исправить ситуацию, пока вы не заставите свой код работать с ними. Тогда никогда не оставляйте их (у меня они всегда есть).

4. @FranceMadrid: » Этот код успешно … » — как? Он даже не запускается на нескольких учетных записях.

Ответ №1:

Просто вспомните, что на прошлой неделе произошло с переменной с более широкой областью видимости. Используйте Text::CSV_XS для обработки файлов CSV.

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

use Text::CSV_XS;

my $week = 'Week';
my $csv = 'Text::CSV_XS'->new({binary => 1, auto_diag => 1});
open my $fh, "<", shift or die $!;
while (my $row = $csv->getline($fh)) {
    print "n" if $week ne $row->[1];
    $week = $row->[1];
    $csv->say(*STDOUT, $row);
}