首页 > 解决方案 > 如何读取 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

我正在读取此文件并根据 CSV 中的信息使用 Perl 填充 HTML 文件:

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 文件信息创建表。但是,它不会创建在 new 之后创建换行符的表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

标签: perlcsv

解决方案


只记得上周在一个范围更广的变量中遇到的。使用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);
}

推荐阅读