我想编写一个带有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文件。我做错了什么?
答案 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