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

如何在Perl中从文件.csv导出一些列?,perl,csv,Perl,Csv,我有一个名为peco1.CSV的CSV文件,我需要使用Perl只为另一个CSV文件分隔前七列 peco1.csv 小时;peco1In;peco1Out;PECO1工作时间;peco2In;peco2Out;peco2工作时间;peco3In;peco3Out;peco3工作时间;peco4In;peco4Out;PECO4工作时间;peco5In;peco5Out;PECO5工作时间;peco6In;peco6Out;PECO6工作时间;peco7In;peco7Out;PECO7工作时间;p

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

peco1.csv
小时;peco1In;peco1Out;PECO1工作时间;peco2In;peco2Out;peco2工作时间;peco3In;peco3Out;peco3工作时间;peco4In;peco4Out;PECO4工作时间;peco5In;peco5Out;PECO5工作时间;peco6In;peco6Out;PECO6工作时间;peco7In;peco7Out;PECO7工作时间;peco8In;peco8Out;PECO8工作时间
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();而(my$row=$CSV->getline(ARGV)){$CSV->print(STDOUT,[@$row[0,2,3]])}”peco1.CSV>new.CSV
如何仅显示前七列

像这样的结果:

小时;peco1In;peco1Out;PECO1工作时间;peco2In;peco2Out;PECO2工作时间
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

既然您只想修剪标题行,那就不太糟糕了

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");
     }
}
my$infle='peco1.csv';

打开(我的$fh,"我认为您所做的是找到一个类似的示例,并将其应用到您自己的数据中而不进行更改。很明显,您的一行程序从输入文件中复制了第一、第三和第四列,这与您自己的需求无关。它还使用了
Text::CSV_XS
的所有默认选项,其中包括lude使用逗号
作为分隔符。您使用的是分号
,因此不太可能按原样工作

这个程序似乎可以满足您的需要。如果您将它保存为,比如说,
7col\u csv.pl
,那么您可以将其作为

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

输出
小时;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

只有CSV的前7列是的,你能帮我吗?打印“小时;peco1In;peco1Out;peco1WorkTime;peco2In;peco2Out;peco2WorkTime”有什么问题吗\n
?因为是与其他具有其他值的文件一起运行。令人非常失望的是,您所做的唯一努力似乎是找到一个Perl one liner,它可以做一些与您自己的需要相当的事情,并将其复制到堆栈溢出问题中。难道您不认为您可以做一些事情,而不仅仅是依靠internet来获得解决方案吗?这是非常令人失望的st尽可能晚地声明所有变量,而不是像老式的C一样在代码顶部编写一块声明。最好避免使用Python风格的标识符,因此像
$newHead
这样的名称应该看起来像
$new\u head
。声明
@head
$new\u head
两种名称ld在第一个
if
块中。此外,测试可能应该是
if($.==1)
而不是检查行的内容。我不理解您的问题。文本文件通常在末尾结束,您不必担心文件的放置和结尾。请解释您的意思“这很有效,但不会停止"。您得到的结果是什么?当我在windows cmd中运行此命令时,请不要停止…我需要按ctrl+C停止。您是否根据我在顶部显示的命令行运行该程序?是
peco1.csv
普通静态文件,还是使用管道?如果我使用您在问题中显示的数据,则我的解决方案将运行nd生成我显示的输出。你需要告诉我你的情况可能会有什么不同,导致它无休止地运行,否则我无法帮助结果文件是好的,所有数据都是好的,但不要停止…我不知道为什么。。。
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] ] );
}