Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl解析csv文件_Perl - Fatal编程技术网

Perl解析csv文件

Perl解析csv文件,perl,Perl,我只是第一次尝试读取.csv文件。我已通过以下链接: : 我毫不怀疑,如果你愿意,你可以告诉我这个问题很愚蠢,但我不知道,为什么我不能弄清楚perl到底是如何读取csv文件的:( 因此,我的疑问是: 第一个问题 逐行读取csv文件和解析文件之间的区别是什么 我有一个简单的程序,我正在逐行读取csv文件。 以下是我的节目: #!/usr/bin/perl -w use strict; use Text::CSV; use Data::Dumper; my $csv=Text::CSV->n

我只是第一次尝试读取.csv文件。我已通过以下链接:

:

我毫不怀疑,如果你愿意,你可以告诉我这个问题很愚蠢,但我不知道,为什么我不能弄清楚perl到底是如何读取csv文件的:(

因此,我的疑问是:

第一个问题

逐行读取csv文件和解析文件之间的区别是什么

我有一个简单的程序,我正在逐行读取csv文件。 以下是我的节目:

#!/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";
} 
第二个问题:

如果我想获得具体的Emp_id和位置,那么我如何继续

第三个问题:

如果我只需要102713、530201503110 Emp记录,即名称、位置、公司名称,那么我该怎么办


感谢

CSV文件是文本格式表格数据的良好表示形式,但它不适合内存中的表示形式。因此,我们必须创建适当的表示形式。其中一种表示形式是哈希:

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内存不足。在这种情况下,哈希应该与文件绑定,但这是一个完全不同的主题。

CSV文件是文本格式表格数据的良好表示,但不适合内存中的表示。因此,我们必须创建一个ad等同表示法。其中一种表示法是哈希:

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内存不足。在这种情况下,散列应该与文件绑定,但这是一个完全不同的主题。

这里有另一个选项,可以解决第二个问题和第三个问题的一部分:

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;

数组
@empID
包含您感兴趣的ID。在
while
循环中,使用智能匹配操作符(Perl v5.10+)检查每个Emp\u ID查看它是否在id列表中。如果是,将打印Emp_id及其相应位置。

这里是解决第二个问题和第三个问题的另一个选项:

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;

数组
@empID
包含您感兴趣的ID。在
while
循环中,使用智能匹配操作符(Perl v5.10+)检查每个Emp\u ID查看它是否在id列表中。如果是,则打印Emp_id及其对应位置。

解析文件=读取/解释整个内容。逐行让您随时停止,因为一次只处理一行。至于其他问题,一旦数据被人读取/解析,您可以做任何您想做的事情nt返回数组。解析文件=读取/解释整个内容。逐行可以让您随时停止,因为一次只处理一行。至于您的其他问题-一旦个人读取/解析数据,您就可以使用返回的数组执行任何操作。