0

初めて .csv ファイルを読み込もうとしています。以下のリンクを参照しました。

http://metacpan.org/pod/Text::CSV_XS#Reading-a-CSV-file-line-by-line :

私はほとんど疑いを持っていません、あなたが望むなら、これはばかげた質問だと私に言うことができますが、私にはわかりません.perlがどのように正確にcsvファイルを読んでいるかを理解できないのはなぜですか:(

だから、私の疑問は次のとおりです。

最初の質問

csv ファイルを 1 行ずつ読み取ることと、ファイルを解析することの違いは何ですか。

私はcsvファイルを1行ずつ読んでいる簡単なプログラムを持っています。以下は私のプログラムです:

#!/usr/bin/perl -w
use strict;
use Text::CSV;
use Data::Dumper;

my $csv=Text::CSV->new( );
my $my_file="test.csv";
open(my $fl,"<",$my_file) or die"can not open the file $!";
#print "$ref_list\n";

while(my $ref_list=$csv->getline($fl))
{
 
print "$ref_list->[0]\n";
} 

以下はcsvファイルのデータです:

"Emp_id","Emp_name","Location","Company"
102713,"raj","Banglore","abc"
403891,"Rakesh","Pune","Infy"
530201,"Kiran","Hyd","TCS"
503110,"raj","Noida","HCL"

2 番目の質問:

Location とともに特定の Emp_id を取得したい場合は、どうすればよいですか。

3 番目の質問:

102713、530201、503110 Emp レコード、つまり名前、場所、会社名のみが必要な場合は、どうすればよいですか?

ありがとう

4

2 に答える 2

3

CSV ファイルは、表形式のデータをテキスト形式で表現するのに適していますが、メモリ内の表現には適していません。そのため、適切な表現を作成する必要があります。そのような表現の 1 つがハッシュです。

my $hashref = {
   Emp_Id   => ...,
   Emp_name => ...,
   Location => ...,
   Company  => ...,
};

ヘッダー行が配列@headerにある場合、このハッシュを次のように作成できます。

my @header = ...;
my @row = @{$csv->getline($fl)}; # turn the arrayref into an array
my $hashref = {};
for my $i (0..$#header) {
  $hashref->{$header[$i]} = $row[$i];
}
# The $hashref now looks as described above

次に、id 値をキーとして使用するルックアップ ハッシュを作成できます。したがって、%lookup次のようになります。

my %lookup = (
   102713 => $hashref_to_first_line,
   ...,
);

実行して入力します

$lookup{$row[0]} = $hashref;

上記のループの後。次に、特定のハッシュリファレンスにアクセスできます

my $a_certain_id_hashref = $lookup{102713};

または特定の要素に直接アクセスする

my $a_certain_id_location = $lookup{102713}{Location};

キーが存在しない場合、これらのルックアップは を返す必要がありますundef

CSV ファイルが大きすぎると、perl がメモリ不足になる可能性があります。その場合、ハッシュはtieファイルに d する必要がありますが、それは完全に別のトピックです。

于 2012-09-10T05:52:02.287 に答える
0

2 番目の質問と 3 番目の質問の一部に対処する別のオプションを次に示します。

use Modern::Perl;
use Text::CSV;

my @empID = qw/ 102713 530201 503110 /;

my $csv = Text::CSV->new( { binary => 1 } )
  or die 'Cannot use CSV: ' . Text::CSV->error_diag();

my $my_file = "test.csv";
open my $fl, '<', $my_file or die "can not open the file $!";

while ( my $ref_list = $csv->getline($fl) ) {

    if ( $ref_list->[0] ~~ @empID ) {
        say "Emp_id: $ref_list->[0] is Location: $ref_list->[2]";
    }
}

$csv->eof or $csv->error_diag();
close $fl;

出力:

Emp_id: 102713 is Location: Banglore
Emp_id: 530201 is Location: Hyd
Emp_id: 503110 is Location: Noida

配列@empIDには、関心のある ID が含まれています。whileループでは、各 Emp_id がスマート マッチ演算子 (Perl v5.10+) を使用してチェックされ、ID のリストにあるかどうかが確認されます。その場合、Emp_id とそれに対応する Location が出力されます。

于 2012-09-10T06:31:35.320 に答える