1

CSV ファイルに大量のデータがあります。最初の行はすべて文字列 (すべてのテキストとアンダースコア) であり、後続のすべての行はその文字列に関連する数字で埋められています。

最初の行を解析して特定の文字列を見つけ、その文字列がどの列にあったかを覚えてから、ファイルの残りの部分を調べて、同じ列のデータを取得しようとしています。これを 3 つの文字列に対して行う必要があります。

私は Text::CSV を使用してきましたが、最初の行で文字列を見つけて次の行に移動し、同じ列からデータを取得するまでカウンターをインクリメントする方法がわかりません。などこれまでに試したことは次のとおりです。

while (<CSV>) {
    if ($csv->parse($data)) {
        my @field = $csv->fields;
        my $count = 0;
            for $column (@field) {
            print ++$count, " => ", $column, "\n";
        }
    } else {
        my $err = $csv->error_input;
        print "Failed to parse line: $err";
    }
}

$data は 1 行目にあるため、"1 $data" を 25 回 (CSV ファイルの行数) 表示します。$data が見つかった列を覚えさせるにはどうすればよいですか? また、すべての文字列が 1 行目にあることがわかっているので、1 行目だけを解析し、@data 内のすべての文字列を見つけてから、ファイルの残りを解析し、必要な部分からデータを取得するにはどうすればよいですか?列とそれを行列または配列の配列に入れますか?
助けてくれてありがとう!

編集:質問の言い回しが少し不十分であることに気付きました。CSVから列番号を取得する方法がわかりません。これはどのように行われますか?
また、列番号を取得したら、後続の行を実行してその列のみからデータを取得するように CSV に指示するにはどうすればよいですか?

4

2 に答える 2

0

次のようなものを試してください。

use strict;
use warnings;
use Text::CSV;

my $csv = Text::CSV->new({binary=>1});

my $thing_to_match = "blah";
my $matched_index;
my @stored_data = ();

while(my $row= $csv->getline(*DATA)) #grabs lines below __DATA__ 
                                     #(near the end of the script)
{
    my @fields = @$row;

    #If we haven't found the matched index, yet, search for it.
    if(not defined $matched_index)
    {
        foreach my $i(0..$#fields)
        {
            $matched_index = $i if($fields[$i] eq $thing_to_match);
        }
    }

    #NOTE: We're pushing a *reference* to an array!
    #Look at perldoc perldata
    push @stored_data,\@fields;
}

die "Column for '$thing_to_match' not found!" unless defined $matched_index;

foreach my $row(@stored_data)
{
    print $row->[$matched_index] . "\n";
}


__DATA__
stuff,more stuff,yet more stuff
"yes, this thing, is one item",blah,blarg
1,2,3

出力は次のとおりです。

more stuff
blah
2
于 2013-02-07T20:48:39.230 に答える
0

完全な例を書く時間はありませんが、これを行うのに役立つモジュールを作成しました。Tie::Array::CSVは、いくつかの魔法を使用して、csv ファイルを Perl 配列の arrayref のように動作させます。このようにして、Perl の知識を使用してファイルを操作できます。

ただし、警告の言葉!私のモジュールの利点の 1 つは、読み書き可能であることです。読み取りのみが必要なので、割り当てないように注意してください。

于 2013-02-07T21:49:24.557 に答える