#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);
}