我如何从Perl文件.csv导出一些列?

时间:2016-03-01 15:33:56

标签: perl csv

我有一个名为peco1.csv的CSV文件,我需要使用Perl来分隔另一个CSV文件的前七列

peco1.csv

Hour;peco1In;peco1Out;peco1WorkTime;peco2In;peco2Out;peco2WorkTime;peco3In;peco3Out;peco3WorkTime;peco4In;peco4Out;peco4WorkTime;peco5In;peco5Out;peco5WorkTime;peco6In;peco6Out;peco6WorkTime;peco7In;peco7Out;peco7WorkTime;peco8In;peco8Out;peco8WorkTime
10;26;31;100;26;19;100
11;30;43;100;48;27;100
12;26;35;100;36;27;100
13;26;41;100;41;25;100
14;32;43;100;57;32;100
15;23;44;100;77;60;100
16;44;48;100;59;42;100
17;60;67;100;52;49;100
18;35;56;100;48;39;100
19;39;48;100;58;37;100
20;18;29;100;28;30;100
21;24;26;100;16;14;100
22;18;13;100;10;3;100
23;0;0;0;0;0;0

我在Windows的命令行中执行此操作

perl -MText::CSV_XS -e "my $csv = Text::CSV_XS->new();while(my $row = $csv->getline(ARGV)){$csv->print(STDOUT, [@$row[0,2,3]])}" peco1.csv > new.csv

如何只显示前七列?

喜欢这个结果:

Hour;peco1In;peco1Out;peco1WorkTime;peco2In;peco2Out;peco2WorkTime
10;26;31;100;26;19;100
11;30;43;100;48;27;100
12;26;35;100;36;27;100
13;26;41;100;41;25;100
14;32;43;100;57;32;100
15;23;44;100;77;60;100
16;44;48;100;59;42;100
17;60;67;100;52;49;100
18;35;56;100;48;39;100
19;39;48;100;58;37;100
20;18;29;100;28;30;100
21;24;26;100;16;14;100
22;18;13;100;10;3;100
23;0;0;0;0;0;0

2 个答案:

答案 0 :(得分:0)

因为你只想修剪标题行然后这不是太糟糕。

my $infile = 'peco1.csv';

open(my $fh, "<", $infile) or die "Can't open file!";
my @head = ();
my $newHead = '';
while (<$fh>){
     chomp;
     if ($_ =~ m/'Hour'/){
          @head = split(';' , $_);
          @head = splice(@head, 0, 7);
          $newHead = join(';', @head);
          print("newHead\n");
     }
     else{
          print("$_\n");
     }
}

答案 1 :(得分:0)

我认为你所做的就是找到一个类似的例子并将其应用到你自己的数据而不改变它。很明显,您的单行复制输入文件中的第一,第三和第四列,这与您自己的要求无关。它还使用Text::CSV_XS的所有默认选项,其中包括使用逗号,作为分隔符。您正在使用分号;,因此它不太可能按原样运行

这个程序似乎可以满足您的需求。如果您将其另存为7col_csv.pl,则可以将其作为

运行
perl 7col_csv.pl peco1.csv > new.csv


use strict;
use warnings 'all';

use Text::CSV;

my $csv = Text::CSV->new({
    binary   => 1,
    sep_char => ';',
    eol      => $/,
});

while ( my $row = $csv->getline(\*ARGV)) {
    $csv->print( \*STDOUT, [ @$row[0 .. 6] ] );
}

输出

Hour;peco1In;peco1Out;peco1WorkTime;peco2In;peco2Out;peco2WorkTime
10;26;31;100;26;19;100
11;30;43;100;48;27;100
12;26;35;100;36;27;100
13;26;41;100;41;25;100
14;32;43;100;57;32;100
15;23;44;100;77;60;100
16;44;48;100;59;42;100
17;60;67;100;52;49;100
18;35;56;100;48;39;100
19;39;48;100;58;37;100
20;18;29;100;28;30;100
21;24;26;100;16;14;100
22;18;13;100;10;3;100
23;0;0;0;0;0;0