1

我想编写一个脚本,它需要一个 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 文件。我究竟做错了什么?

4

3 回答 3

4

您的程序编写得并不理想,但是如果您按照您的描述在命令行上传递 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;
}
于 2012-07-14T21:07:07.753 回答
2

Yhm..您不需要任何模块来完成此任务,因为 CSV(逗号分隔值)只是文本文件 - 只需打开文件,然后遍历其行(写入输出除特定数字之外的所有行,例如 first )。这样的任务(跳过第一行)非常简单,使用命令行单行代码可能比使用专用脚本更好。

快速搜索 - 示例参见此链接,有许多关于 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++; '

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

于 2012-07-14T21:04:34.790 回答
0

由于 Windows,您错过了第一个(也是唯一一个)论点。

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

于 2012-07-16T14:24:13.323 回答