我编写了一个简单的perl脚本来计算散列中的值和/或键的数量,这是根据csv的内容创建的.csv看起来像这样:
311552047969,THE UPSETTERS RETURN OF THE SUPER APE VINYL LP 1978 ,http://www.ebay.co.uk/itm/UPSETTERS-RETURN-SUPER-APE-VINYL-LP-1978-/311552047969,56.0
322016291276,Queen A Kind Of Magic NZ Orange Vinyl,http://www.ebay.co.uk/itm/Queen-Kind-Magic-NZ-Orange-Vinyl-/322016291276,165.0
252288285264,Goldfrapp Black cherry vinyl record lp,http://www.ebay.co.uk/itm/Goldfrapp-Black-cherry-vinyl-record-lp-/252288285264,70.0
331782523967,Reggae vinyl johny pram pram ,http://www.ebay.co.uk/itm/Reggae-vinyl-johny-pram-pram-/331782523967,73.0
391392294381,Various vinyl albums,http://www.ebay.co.uk/itm/Various-vinyl-albums-/391392294381,102.24
Run Code Online (Sandbox Code Playgroud)
这是我的脚本来计算行数.
#!/bin/perl
open CSV2, "<csv2" or die;
@csv2=<CSV2>;
close CSV2;
%hash = @csv2;
@keys = keys %hash;
@values = values %hash;
$size = @values;
print "Hash size is $size";
Run Code Online (Sandbox Code Playgroud)
csv中的实际行数是6374,但是我的代码输出恰好是3187的一半.
我确信这有一个简单的解释,但为什么哈希的大小(即值/键的数量)不匹配我的csv中的行数?
将列表分配给散列时,列表的偶数索引元素将成为键,列表中的奇数索引元素将成为值.因此,散列中的键的数量将是列表中的一半,而散列中的值的数量是散列中的一半,如果列表中的元素数是偶数,则列表中有元素.否则,哈希中的n/2 + 1键和n值将n是列表中元素的数量.
您可能想要做的是将元素插入到由CSV列0中的ID键入的哈希值中.
#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV_XS;
my @fields = qw( title url price);
my $csv = Text::CSV_XS->new({ allow_whitespace => 1});
my %data;
while (my $row = $csv->getline(\*DATA)) {
my ($key) = shift @$row;
next unless defined($key) and length($key);
for ( @$row ) {
s/^\s+//;
s/\s+\z//;
}
@{ $data{$key} }{ @fields } = @$row;
}
use Data::Dumper;
print Dumper \%data;
__DATA__
311552047969,THE UPSETTERS RETURN OF THE SUPER APE VINYL LP 1978 ,http://www.ebay.co.uk/itm/UPSETTERS-RETURN-SUPER-APE-VINYL-LP-1978-/311552047969,56.0
322016291276,Queen A Kind Of Magic NZ Orange Vinyl,http://www.ebay.co.uk/itm/Queen-Kind-Magic-NZ-Orange-Vinyl-/322016291276,165.0
252288285264,Goldfrapp Black cherry vinyl record lp,http://www.ebay.co.uk/itm/Goldfrapp-Black-cherry-vinyl-record-lp-/252288285264,70.0
331782523967,Reggae vinyl johny pram pram ,http://www.ebay.co.uk/itm/Reggae-vinyl-johny-pram-pram-/331782523967,73.0
391392294381,Various vinyl albums,http://www.ebay.co.uk/itm/Various-vinyl-albums-/391392294381,102.24
Run Code Online (Sandbox Code Playgroud)
$ ./pppp.pl
$VAR1 = {
'252288285264' => {
'url' => 'http://www.ebay.co.uk/itm/Goldfrapp-Black-cherry-vinyl-record-lp-/252288285264',
'title' => 'Goldfrapp Black cherry vinyl record lp',
'price' => '70.0'
},
'322016291276' => {
'price' => '165.0',
'title' => 'Queen A Kind Of Magic NZ Orange Vinyl',
'url' => 'http://www.ebay.co.uk/itm/Queen-Kind-Magic-NZ-Orange-Vinyl-/322016291276'
},
'311552047969' => {
'url' => 'http://www.ebay.co.uk/itm/UPSETTERS-RETURN-SUPER-APE-VINYL-LP-1978-/311552047969',
'title' => 'THE UPSETTERS RETURN OF THE SUPER APE VINYL LP 1978',
'price' => '56.0'
},
'331782523967' => {
'url' => 'http://www.ebay.co.uk/itm/Reggae-vinyl-johny-pram-pram-/331782523967',
'price' => '73.0',
'title' => 'Reggae vinyl johny pram pram'
},
'391392294381' => {
'url' => 'http://www.ebay.co.uk/itm/Various-vinyl-albums-/391392294381',
'title' => 'Various vinyl albums',
'price' => '102.24'
}
};