如何复制CSV文件,但跳过第一行?

时间:2012-07-14 20:49:41

标签: perl csv

我想编写一个带有CSV文件的脚本,删除其第一行并创建一个新的输出csv文件。

这是我的代码:

use Text::CSV_XS;
use strict;
use warnings;
my $csv = Text::CSV_XS->new({sep_char => ','});
my $file = $ARGV[0];
open(my $data, '<', $file) or die "Could not open '$file'\n";
my $csvout = Text::CSV_XS->new({binary => 1, eol => $/});
open my $OUTPUT, '>', "file.csv" or die "Can't able to open file.csv\n";
my $tmp = 0;
while (my $line = <$data>) {
    # if ($tmp==0)
    # {
    # $tmp=1;
    # next;
    # }
    chomp $line;
    if ($csv->parse($line)) {
        my @fields = $csv->fields();
        $csvout->print($OUTPUT, \@fields);
    } else {
        warn "Line could not be parsed: $line\n";
    }
}

在perl命令行上,我写了c:\test.pl csv.csv并且它没有创建file.csv输出,但是当我双击脚本时,它会创建一个空白的CSV文件。我做错了什么?

3 个答案:

答案 0 :(得分:3)

您的程序写得不理想,但如果您按照描述在命令行上传递CSV文件,我无法说明它为什么不起作用。您是否收到错误Could not open 'csv.csv'Can't able to open file.csv?如果不是,则必须在当前目录中创建该文件。也许你在寻找错误的地方?

如果您只需删除第一行,则无需使用模块处理CSV数据 - 您可以将其作为简单的文本文件处理。

如果在命令行中指定了文件,就像在c:\test.pl csv.csv中一样,您可以从中读取文件,而无需使用<>运算符明确打开它。

只有当行计数器($.变量)不等于1时,此程序才会读取输入文件中的行并将它们打印到输出中。

use strict;
use warnings;

open my $out, '>', 'file.csv' or die $!;

while (my $line = <>) {
  print $out $line unless $. == 1;
}

答案 1 :(得分:2)

嗯..你不需要任何模块来完成这项任务,因为CSV(逗号分隔值)只是文本文件 - 只是打开文件,并在其行上迭代(写入输出除特定数字以外的所有行,例如,首先)。这样的任务(跳过第一行)非常简单,使用命令行一行而不是专用脚本可能会更好。

快速搜索 - 请参阅这个链接的例子,有很多关于perl输入/输出操作的教程

http://learn.perl.org/examples/read_write_file.html

PS。 Perl脚本(程序)通常不会“编译”成二进制文件 - 它们当然是“编译”的,但是,嗯,在运行中 - 这就是为什么/ usr / bin / perl被称为“解释器”而不是“编译器”之类的gcc或g ++。我想你正在寻找的是一些带有语法高亮和其他开发产品的编辑器 - 你可能可以尝试使用带有perl插件的Eclipse(跨平台)。

http://www.eclipse.org/downloads/

http://www.epic-ide.org/download.php/

user@localhost:~$ cat blabla.csv | perl -ne 'print $_ if $x++; '

跳过第一行(仅当变量在每次使用后增加时才打印出来)

答案 2 :(得分:0)

由于Windows,您缺少第一个(也是唯一的)参数。

我认为这个问题会对您有所帮助:@ARGV is empty using ActivePerl in Windows 7