0

PERL プログラムのエラーを理解しようとしています。コンマ区切りファイルがあり、各行の最初のフィールドの内容をファイル名として使用して、各行の内容を個別のテキスト ファイルに抽出したいと考えています。

以下のプログラムは、csv ファイルの最初の行をスキップすることを除いて、まさにこれを行います。いくつかの印刷コマンドを追加して、エラーの原因を突き止めようとしました。22 行目の print コマンドは、1 行目が 21 行目のコマンドによって読み取られることを示しています。ただし、foreach ループが開始されると、1 行目は印刷されません。

問題がよくわかりません。どんな助けにも感謝します!

#!/usr/bin/perl
# script that takes a .csv file (such as that exported from Excel) and 
# extracts the contents of each row into a separate text file, using the first column as the filename
# original source: http://www.tek-tips.com/viewthread.cfm?qid=1516940
# modified 3/14/12
# usage = ./export_rows.pl <yourfilename>.csv

use warnings;
use strict;
use Text::CSV_XS;
use Tie::Handle::CSV;

unless(@ARGV) {
    print "Please supply a .csv file at the command line! For example, export_rows.pl myfile.csv\n";
    exit;
}

my $fh = Tie::Handle::CSV->new(file => $ARGV[0],
                           header => 0);

my @headers = @{scalar <$fh>};
print "$headers[0]\n\n";

foreach my $csv_line (<$fh>) {
    print "$csv_line->[0]\n";
    open OUT, "> $csv_line->[0].txt" or die "Could not open file $csv_line->[0].txt for output.\n$!";
    for my $i (1..$#headers) {
         print OUT "$csv_line->[$i]\n";
    }
    close OUT;
 }

 close $fh;
4

1 に答える 1

5

for ループで 0 から始めてみてください。

for my $i (1..$#headers)

次のようにする必要があります。

for my $i (0..$#headers)

編集:

ファイルの最初の行を取得するには、 Tie::Fileを使用できます

サンプルコードは次のとおりです。

my @arr;
tie @arr, 'Tie::File', 'a.txt' or die $!;
my $first = $arr[0];
untie @arr;

print "$first\n";

このモジュールは、配列内のインデックスにアクセスすることでファイルの行にアクセスできるという点で優れています。あなたのファイルが大きい場合、それは信じられないほど効率的ではありませんが、ここで間違いなく使用できると思います.

于 2012-08-23T20:37:24.337 に答える