如何在perl中合并多个CSV文件?
例如,我的文件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 :(得分:3)
回到尝试多维散列:Hash of hashes perl,您需要更改正在使用的数据结构,以便存储特定元素的多个条目。
可以直观地将CSV读入2级哈希。 csv的行可以通过它们的ID进行散列(在这种情况下,我猜ID是数字't.100','t.1000'等),每行的值可以存储在二级哈希中使用标题字符串作为其键。如果您使用Data :: Dumper查看结构,它将看起来像这样:
$VAR1 = {
't.1000' => {
'info' => 'pentium 3',
'availability' => 'yes',
'type' => 'computer'
},
't.100' => {
'info' => 'pentium 2',
'availability' => 'yes',
'type' => 'computer'
}
};
'number'是否也是每个'row hash'的关键取决于你可能有多大的用途(通常你已经知道该行的密钥才能访问它)。
此数据结构可以存储一个CSV文件。但是,我们需要添加额外的复杂层,以便以您描述的方式处理合并多个CSV。例如,为了跟踪特定ID出现的文件,我们可以存储第三个哈希值作为“可用性”键的值,因为这是在相同“数字”的条目之间变化的值:< / p>
'availability' => {
'Packet1' => 'yes',
'Packet2' => 'no'
};
将所有文件读入此结构后,打印最终的CSV将是循环外部哈希键的过程,并且对于每一行,以正确的顺序“加入”行的键。 “数据包”哈希也可以循环以检索所有“可用性”值,这些值可以附加到每行的末尾。
我希望这有助于您了解处理此类数据的一种可能方法。如果您发现它们很困难,您可以询问实施的具体部分,我将很高兴详细说明。
答案 1 :(得分:0)
computer
?在弄清楚如何处理这个问题之前,你真的必须回答这些问题。但是,您可能需要处理references。
我认为你的问题与标准Perl数据结构只存储单个值的事实有关。您可以拥有单个值的哈希值,并且可以包含单个值的数组,但每个结构块中不能包含多个值。 Perl通过使用 references 来解决这个问题。
例如,假设您有一个名为%computer 的哈希,该哈希由第二个字段键入:
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";
你也可以通过解除引用数组来使用push
和pop
:
push @{ $computer{t.100}->{AVAILABILITY} }, "yes";
请注意,我用$computer{t.100}->{AVAILABILITY}
包围了对数组@{...}
的引用,它从引用转换回数组。
我希望这就是你所要求的。您可以使用Text::CSV模块来解析您的CSV文件,但如果格式不是太古怪,您可能只需使用split
命令。