【问题标题】:How do I copy a CSV file, but skip the first line?如何复制 CSV 文件,但跳过第一行?
【发布时间】:2012-07-14 07:07:03
【问题描述】:

我想编写一个脚本来获取一个 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 文件。我做错了什么?

【问题讨论】:

    标签: perl csv


    【解决方案1】:

    由于 Windows,您丢失了第一个(也是唯一一个)参数。

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

    【讨论】:

      【解决方案2】:

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

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

      如果文件是在命令行中指定的,如c:\test.pl csv.csv,则无需使用&lt;&gt; 运算符显式打开即可读取。

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

      use strict;
      use warnings;
      
      open my $out, '>', 'file.csv' or die $!;
      
      while (my $line = <>) {
        print $out $line unless $. == 1;
      }
      

      【讨论】:

        【解决方案3】:

        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/

        这个

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

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

        【讨论】:

        • 您的 bash 行可能不适用于 @user1526112,因为不幸的是他似乎没有使用 unixoid 系统。 perl -ne 'print $_ if $x++;' infile.csv 应该可以解决问题。我不太了解“cmd.exe”,但附加 &gt; outfile.csv 可能会将输出放在您想要的位置。
        猜你喜欢
        • 2015-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 2018-06-12
        • 2014-04-12
        • 2020-12-15
        • 1970-01-01
        相关资源
        最近更新 更多