Как читать CSV и отслеживать, где меняется определенное значение - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть файл 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 голосов
/ 13 апреля 2019

Просто запомните последнюю неделю, встреченную в переменной с более широкой областью действия. Используйте 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...