如何从每行中删除尾随的,?
现有CSV文件:
S.NO,NAME,S1,S2,S3,S4,S5,
1,aaaaaaa,66,88,77,55,99,
2,bbbbbbb,55,66,88,99,77, 代码是:
#!/usr/bin/perl
use strict;
use warnings;
open my $inn, '<', 'a1.csv' or die "Cannot open file for input: $!";
open my $outt, '>', 'a2.csv' or die "Cannot open file for output: $!";
foreach my $line (<$inn>) {
chomp $line;
my @data = split /,/, $line;
printf $outt "%s,%d\n", $data[0], scalar grep /^GO:/, @data;
} 我期望的输出CSV文件:
S.NO,NAME,S1,S2,S3,S4,S5
1,aaaaaaa,66,88,77,55,99
2,bbbbbbb,55,66,88,99,77发布于 2019-08-23 18:46:59
在一次处理一行文件时,最好使用while (它也会一次读取文件一行)而不是foreach (它会先读取整个文件,然后再给出第一行)。
如果您只想删除最后一个逗号,则无需将该文件视为CSV文件。
#!/usr/bin/perl
use strict;
use warnings;
open my $inn, '<', 'a1.csv' or die "Cannot open file for input: $!";
open my $outt, '>', 'a2.csv' or die "Cannot open file for output: $!";
while (<$inn>) {
# Remove trailing comma on first line
s/,$// if $. == 1;
print $outt $_;
}发布于 2019-08-23 18:36:42
Tux提供的munge_column_names补丁。这构成了每个未命名列标题的唯一名称。
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
use Text::CSV;
my @headers = qw(S.NO NAME S1 S2 S3 S4 S5);
my $csv_in = Text::CSV->new({binary => 1, auto_diag => 1});
my $csv_out = Text::CSV->new({binary => 1, auto_diag => 1});
open my $in, '<:encoding(UTF-8)', 'a1.csv';
open my $out, '>:encoding(UTF-8)', 'a2.csv';
my $eix = "001";
$csv_in->header($in, {munge_column_names => sub { s/^$/"E".$eix++/er; }});
$csv_out->say($out, [@headers]);
while (my $row = $csv_in->getline_hr($in)) {
$csv_out->say($out, [$row->@{@headers}]);
}https://stackoverflow.com/questions/57623928
复制相似问题