2012-11-28 118 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命令。