2012-11-28 116 views
0

如何合并多个CSV文件在Perl中?合并多个CSV文件perl

例如,我有文件1 Packet1.csv看起来像:

#type, number, info, availability 
computer, t.100, pentium 2, yes 
computer, t.1000, pentium 3, yes 
computer, t.2000, pentium 4, no 
computer, t.3000, pentium 5, yes 

和文件2 Packet2.csv看起来像:

#type, number, info, availability 
computer, t.100, pentium 2, yes 
computer, t.1000, pentium 3, no 
computer, t.2000, pentium 4, no 
computer, t.4000, pentium 6, no 

,我想要的输出是一个单个文件所在数数据包不固定:

#type, number, info, **Packet1** availability, **Packet2** availability 
computer, t.100, pentium 2, yes, yes 
computer, t.1000, pentium 3, yes, no 
computer, t.2000, pentium 4, no, no 
computer, t.3000, pentium 5, yes 
computer, t.4000, pentium 6, no 
+0

你有多少数据?将所有内容加载到内存中是否可行?您的输入是否总是按照示例排序? – pmakholm

+1

@Tim N我曾尝试使用多维哈希 – TheBlackCorsair

+0

@TheBlackCorsair它为什么不工作? – Tim

回答

3

回到多维哈希的尝试:Hash of hashes perl,您将需要更改您正在使用的数据结构,以便存储特定元素的多个条目。

可以直观地将CSV读入具有2级的散列。 csv的行可以通过它们的ID进行散列(在这种情况下,我猜ID是数字't.100','t.1000'等),并且每行的值可以存储在第二级哈希中标题字符串作为其键。它会是这个样子,如果你看到有数据::自卸车结构:

$VAR1 = { 
      't.1000' => { 
         'info' => 'pentium 3', 
         'availability' => 'yes', 
         'type' => 'computer' 
         }, 
      't.100' => { 
         'info' => 'pentium 2', 
         'availability' => 'yes', 
         'type' => 'computer' 
        } 
     }; 

无论是“数字”,也是每个“行散”的关键是你依赖于如何有用,可能是(通常你已经知道该行的关键是为了访问它)。

为了存储一个CSV文件,这个数据结构可以很好。不过,我们需要增加一层额外的复杂性,以便按照您所描述的方式处理多个CSV。例如,为了跟踪特定ID出现的文件,我们可以存储第三个哈希值作为'可用性'键的值,因为这是在相同'数字'的条目之间变化的值:

'availability' => { 
      'Packet1' => 'yes', 
      'Packet2' => 'no' 
     }; 

一旦所有文件已经被读入这种结构,打印最终CSV出来,然后循环在外哈希键,每一行的过程中,正确的顺序“加入”该行的钥匙。 “数据包”散列也可循环检索所有“可用性”值,并可将这些值附加到每行的末尾。

我希望能帮助您理解处理这类数据的一种可能方式。如果您发现它们很困难,您可以询问实施的具体部分,我会很乐意详细说明。

+0

我喜欢这个答案。 +1 – mpe

+0

谢谢@kikumbob我会试一试,我会让你知道 – TheBlackCorsair

0
  • 如何识别哪台电脑是哪台?你是否依靠前三个领域作为计算机标识?
  • 如果第一个字段不是computer
  • 如果两个文件不同意计算机类型会发生什么?

你真的要回答这些问题之前,你可以找出如何处理这个问题。但是,您可能需要处理references

我认为你的问题与标准的Perl数据结构只存储一个值的事实有关。您可以拥有单个值的散列,并且可以有单个值的数组,但是每个结构中不能有多个值。 Perl通过使用引用来解决这个问题。

例如,假设你有一个名为%计算机是由第二场加密散列:

my %system; 

$system{t.100} = {} #This is a hash of hashes 
$system{t.100}->{INFO} = "pentium 2"; 
$system{t.100}->{TYPE} = "computer"; 
$computer{t.100}->{AVAILABLITY} = [] #Storing an array in this hash entry (hash of hashes of arrays) 
$computer{t.100}->{AVAILABILITY}->[0] = "yes"; 
$computer{5.100}->{AVAILABILITY}->[1] = "yes"; 

你也可以使用pushpop通过提领数组:

push @{ $computer{t.100}->{AVAILABILITY} }, "yes"; 

注意,我与@{...}包围的参考阵列$computer{t.100}->{AVAILABILITY},它从一个参照的文匝ce返回数组。

我希望这是你在问什么。您可以使用Text::CSV模块解析您的CSV文件,但如果格式不太古怪,则可能只需使用split命令。