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
我正在读取此文件并根据 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
解决方案
只记得上周在一个范围更广的变量中遇到的。使用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);
}
推荐阅读
- python - 无法使用 xPath 定位元素
- python - 如何从原始图像文件中获取每像素 10 位?
- c# - 界面中的列表
- regex - 在不复制表达式的情况下,强制正则表达式用引号括起来或根本不用引号
- r - 当某些观察值少于 n 行时,使用 dplyr 在数据帧中对每组随机采样 n 行
- python - OpenCV中PIL库函数ImageEnhance.Contrast(image).enhance(param)的等价物是什么?
- c# - 无法将列表附加到现有文件。C#
- r - 使用点 (...) 将不同的参数传递给内部函数
- jenkins - 错误无法建立一个或多个指定的浏览器连接。这可能是由网络问题或远程设备故障引起的
- reflection - Threejs:glb文件反映环境但不反映自身