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

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++; '

最初の行をスキップします ( variable を使用するたびにインクリメントされた変数が 0 より大きい場合にのみ出力されます )

于 2012-07-14T21:04:34.790 に答える
0

Windows が原因で、最初の (そして唯一の) 引数がありません。

この質問が役立つと思います: @ARGV is empty using ActivePerl in Windows 7

于 2012-07-16T14:24:13.323 に答える