首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CSV到哈希表

CSV到哈希表
EN

Stack Overflow用户
提问于 2009-06-18 20:37:25
回答 5查看 17.8K关注 0票数 4

我有一个csv,第一列是一个标签,后面跟着逗号分隔值:

代码语言:javascript
运行
复制
LabelA,45,56,78,90
LabelB,56,65,43,32
LabelC,56,87,98,45

我希望第一列(LabelA等)是散列中的键,其数值位于一个数组中。

我可以将文件读入数组或标量,但我不确定之后该做什么。建议??

编辑:好的,看起来像是将值赋给了一个键..but我的例子中逗号分隔的数字呢?他们要去哪里?它们是否在%hash中?如果是这样的话,你可以进一步简化你的解释吗?谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-18 21:07:07

好吧,让我们假设没有特殊的字符等等。

首先打开文件:

代码语言:javascript
运行
复制
open my $fh, '<', 'some.file.csv' or die "Cannot open: $!";

然后在循环中读取它:

代码语言:javascript
运行
复制
while (my $line = <$fh>) {

然后,删除尾随的白色字符(\n和其他字符):

代码语言:javascript
运行
复制
$line =~ s/\s*\z//;

并将其拆分成数组:

代码语言:javascript
运行
复制
my @array = split /,/, $line;

当它在数组中时,你从数组中得到第一个元素:

代码语言:javascript
运行
复制
my $key = shift @array;

并将其存储在散列中:

代码语言:javascript
运行
复制
$hash{$key} = \@array;

(\@array表示引用数组)。

完整代码:

代码语言:javascript
运行
复制
my %hash;
open my $fh, '<', 'some.file.csv' or die "Cannot open: $!";
while (my $line = <$fh>) {
  $line =~ s/\s*\z//;
  my @array = split /,/, $line;
  my $key = shift @array;
  $hash{$key} = \@array;
}
close $fh;
票数 8
EN

Stack Overflow用户

发布于 2009-06-18 21:13:56

就我个人而言,我喜欢Text::CSV_XSIO::File模块:

代码语言:javascript
运行
复制
use Text::CSV_XS;
use IO::File;

# Usage example:
my $hash_ref = csv_file_hashref('some_file.csv');

foreach my $key (sort keys %{$hash_ref}){
   print qq{$key: };
   print join q{,}, @{$hash_ref->{$key}};
   print qq{\n};
}

# Implementation:
sub csv_file_hashref {
   my ($filename) = @_;

   my $csv_fh = IO::File->new($filename, 'r');
   my $csv = Text::CSV_XS->new ();

   my %output_hash;

   while(my $colref = $csv->getline ($csv_fh))
   {
      $output_hash{shift @{$colref}} = $colref;
   }

   return \%output_hash;
}
票数 12
EN

Stack Overflow用户

发布于 2009-06-18 20:57:13

参见perlfunc splitperldsc

  1. 读取每一行。
  2. 压缩它。
  3. 用逗号拆分它。
  4. 使用结果中的第一个值作为HoA的键。
  5. 其他值成为数组。
  6. 将对数组的引用存储在hash中

创建一个hash of array references

您的数据结构应该如下所示:

代码语言:javascript
运行
复制
my %foo = (
    LabelA => [  2, 3,  56, 78, 90 ],
    LabelB => [ 65, 45, 23, 34, 87 ],
    LabelC => [ 67, 34, 56, 67, 98 ],
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1015061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档