合并多个CSV文件perl

时间:2012-11-28 13:16:40

标签: perl csv merge

如何在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

2 个答案:

答案 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";

你也可以通过解除引用数组来使用pushpop

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

请注意,我用$computer{t.100}->{AVAILABILITY}包围了对数组@{...}的引用,它从引用转换回数组。

我希望这就是你所要求的。您可以使用Text::CSV模块来解析您的CSV文件,但如果格式不是太古怪,您可能只需使用split命令。