2010-05-31 63 views
0

現在我正在嘗試同步按日期列出的兩個數據文件,以便稍後進行比較。不過,我似乎無法僅打印日期匹配的行。此時我已將每個文件的數據分成兩個數組。我只需要找到兩個數組中的日期並將其打印出來。任何建議將不勝感激。perl中匹配來自2個數組的元素

這裏是設置,我一起工作的原始數據的樣本,每個文件是在相同的格式:

 
09/11/2009,00:56:00,51.602,47.894,87,88,0,1032 
09/12/2009,00:56:00,57.794,55.796,93,54,0,1023.6 
09/13/2009,00:56:00,64.292,62.204,93,66,0,1014.4 
09/14/2009,00:56:00,61.592,55.4,80,25,0,1009.6 
09/15/2009,00:56:00,58.604,53.798,84,31,0,1009.1 
09/16/2009,00:56:00,53.6,48.902,84,45,0,1017 

我已日期分成每個文件的陣列。我的最終目標是隻打印兩行文件都有數據的代碼行。所以要做到這一點,我想比較兩個數組與日期元素。

我最初的代碼是這樣的:

foreach $bdate(@bdate){ 
while (<PL>){ 
    chomp; 
    @arr = split (/,/); 
    $pday=$arr[1]; 
    push @pdate, $pday; 
    if ($bdate eq $pdate){ 
     print "$bdate,$pday\n"; 
    } 
} 
+2

你是什麼意思「按日期上市」?你能否提供一些示例代碼來顯示你有多遠,哪些部分不起作用? – Ether 2010-05-31 17:46:46

+0

繼承人和我的數據集的例子,爲了我的問題的目的,我已經拆分了保留mm/dd/yyyy格式的日期並將其推入數組中。我需要採用這些數組中的兩個,並只查找兩個數組中的日期。 02/12/2010,00:56:00,27.302,15.602,61,27,3.24193043478261,1001 02/13/2010,00:56:00,26.006,6.008,42,75,1.6209652173913,1005.8 02 /14/2010,00:56:00,26.708,16.502,65,329,18.9112608695652,992.9 02/15/2010,00:56:00,30.902,19.004,61,287,8.64514782608696,996。8 – Paul 2010-05-31 20:21:13

+0

繼承人我試過的第一個代碼的樣本: foreach $ bdate(@bdate){ while(){ chomp; \t @arr = split(/,/); \t $ pday = $ arr [1]; \t push @pdate,$ pday; \t \t if($ bdate eq $ pdate){ \t \t print「$ bdate,$ pday \ n」; \t \t} \t \t \t } – Paul 2010-05-31 20:23:22

回答

0

你是不是使用Unix的外部功能「通訊」?

+0

我認爲OP正在尋找匹配每一行的第一列。 comm對此沒有多大用處。 – RET 2010-05-31 23:31:58

4

一種方式(很多)將是遍歷每個數組一次,構建一個哈希如下;

for (@array1, @array2) { 
    $dates{$_}++; 
} 

然後,您可以打印對應於值爲2或更多的鍵;

print $_,"\n" for grep {$dates{$_} > 1} keys %dates; 

(未經測試,寫了一臺機器上沒有的Perl)

...和快速CPAN搜索變成了List::Compare,這個例子;

$lc = List::Compare->new(\@Llist, \@Rlist); 

@intersection = $lc->get_intersection; 
+0

感謝您的建議,但第一種方法未能省略第二個數組中的日期,而不是第一個。而第二種方法我無法使用,因爲該模塊沒有安裝在我的數據所在的服務器上。它的學校服務器,所以我不能安裝它。會碰巧有其他建議嗎? – Paul 2010-05-31 20:04:19

+0

@Paul,這個答案和其他答案是尋找列表(交集)中常見元素的常用方法。出於這個原因,我懷疑你的數據或者你是如何解釋它可能會有一些有趣的事情。你能編輯你的問題以包含樣本數據和預期結果嗎? – 2010-05-31 20:22:23

+0

它很可能是我如何解釋它的問題,我是非常新的和自我教自己的Perl。上面列出了我正在使用的原始數據的樣本。在我的腳本中,我只將日期放入了我正在處理的兩個文件的數組中。您建議的第一種方法可以很好地消除第一個數組中不在第二個數組中的日期,但是在第二個數組中打印的日期不存在。我想我的預期結果是打印出兩個陣列通用的日期列表。 – Paul 2010-05-31 20:38:14

1

這裏的示例從perlfaq4(簡化的一個位):

my (@intersection, %count); 

for my $element (@array1, @array2) { $count{$element}++ } 

for my $element (keys %count) { 
    push @intersection, $element if $count{$element} > 1;   
} 

更慣用的版本:

my (%union, %isect); 
for my $e (@array1, @array2) { $union{$e}++ && $isect{$e}++ } 

my @intersection = keys %isect; 

兩種方法都假設每個元素是一個給定的陣列中是唯一的。

+0

感謝您的建議,但第一種方法沒有產生任何結果,第二種方法產生結果,但它們不正確。當我手動檢查輸出時,它包含了幾個不在兩個數組中的日期。感謝您的時間,會碰到任何其他建議? – Paul 2010-05-31 20:08:55

相關問題