Perl解析csv文件
我只是第一次尝试读取.csv文件。我已通过以下链接: : 我毫不怀疑,如果你愿意,你可以告诉我这个问题很愚蠢,但我不知道,为什么我不能弄清楚perl到底是如何读取csv文件的:( 因此,我的疑问是: 第一个问题 逐行读取csv文件和解析文件之间的区别是什么 我有一个简单的程序,我正在逐行读取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
#!/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返回数组。解析文件=读取/解释整个内容。逐行可以让您随时停止,因为一次只处理一行。至于您的其他问题-一旦个人读取/解析数据,您就可以使用返回的数组执行任何操作。