2012-07-14 125 views
0

我想编写一个采用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文件。我究竟做错了什么?

回答

2

Yhm ..你不需要任何模块来完成这个任务,因为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/

[email protected]:~$ cat blabla.csv | perl -ne 'print $_ if $x++; ' 

跳过第一行(打印出仅当变量递增后它每一次使用超过零)

+0

你的bash的行可能不会对@ user1526112工作,因为他不幸似乎没有被使用unixoid系统。 'perl -ne'print $ _ if $ x ++;'' INFILE。csv'应该可以做到。我不太了解“cmd.exe”,但追加'> outfile.csv'可能会将输出放到您想要的位置。 – amon 2012-07-14 21:58:57

3

你的程序ISN”理想情况下写入,但我不能说出为什么它不起作用,如果你通过命令行上的CSV文件,你h大家介绍。你会得到错误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; 
} 
相关问题