2016-11-27 38 views
0

現在我正在嘗試使用屬於兩個不同輸入文件的某些數據進行一些比較。如何讀取很多Colums作爲文件中的數據並在Perl中正確存儲它們

第一個輸入文件如下所示:我有兩行和很多列。

id date1  time1  date2  time2  ne CC0 CC1 CC2 CC3 CC4... due to CC127 

1 2016-09-26 14:13:56 2016-09-26 14:08:56 S1 7 1226 0 86 0 
2 2016-09-26 14:13:56 2016-09-26 14:08:56 S2 8 1346 2 97 12 

第二個輸入文件是這樣的:

ne type time threshold 

S1 CC000 09 50 

S1 CC000 10 50 

S1 CC000 11 50 

S1 CC000 12 50 

S1 CC000 13 50 

S1 CC000 14 50 

我的主要目的是看這兩個文件,存儲必要的信息和DATAS的陣列。如果時間(如一小時)和新條件匹配,那麼我們想要比較它的數據和它的閾值。如果數據大於閾值,我想保留這些數據,並將結果寫入另一個文件。例如,對於ne S1和小時14,CC0數據等於7並且閾值等於50.

迄今爲止ı寫了此代碼; (最後的編輯之一,克里斯的幫助)

#! /usr/bin/perl -w 

#compiler profilleri 
use strict; 
use warnings; 

#dosya locationları 

my $input_file="C:/Perl64/output/innput.txt"; 
my $s1_threshold="C:/Perl64/output/s1_threshold.txt"; 

#komutlar###### 


my $date; my $time; my $ne; my @hour; my @cc; 
my $i=0; my $j=0; 

    open INPUT, "< $input_file" or die "$0: open of $input_file failed, error: $! \n"; 

    while (defined ($_=<INPUT>)) 
    { 

     my $line1 = $_; 
     my (undef, $date, $time, undef, undef, $ne, @cc) = split (' ',$line1); 
     #print("$cc[16]\n"); 

     my @time1= split(':',$time); 
     @hour=split(',',$time1[0]); 

     #print("@hour\n"); 

    open THR, "< $s1_threshold" or die "$0: open pf $s1_threshold failed, error: $! \n"; 
    while (defined($_=<THR>)) 
    { 
     my $line2=$_; 
     my ($ne1, $cc_type, $time1, $threshold) =split(' ',$line2); 

     if($hour[0] == $time1 && $ne eq $ne1) 
     { 
      for ($i=0;$i<128;$i++) 
      { 
       if ($cc[$i] > $threshold) 
       { 
        # print("$cc[$i]\n"); 
       } 
      } 
     } 
    } 
    } 

我現在可以正確地獲得一個簡單的方式,所有的數據,但是當涉及到最終如果命令我的意思是,

if ($  cc[$i] > $threshold) 

CC數組值與所有的閾值進行比較,而不僅僅是相關cc_type和小時的值。 第二個輸入文件包含響應cc_types的閾值。對於每個cc_type,關於小時有23個不同的值,所以我只想比較特定小時和cc_type。如何解決這個問題?

(當我想出了第一部分,我會通過增加對S2的另一閾文件添加相同的過程。)

我在Perl語言是一個新手,所以與此相關的任何答案讚賞。 在此先感謝。 此致敬禮。

回答

0

UPDATE改變比較線if ($hour1 == $hour2 && $ne1 eq $ne2)和移動my $i = ...if語句中。

如果我正確理解'type'變量,(CC000 =>000),那麼這裏更改的代碼可能會做你所需要的。

而不是使用substr來獲取數據,我split字段到變量。

在第一個文件中,最後一個接收器@cc獲取輸入行中的所有其餘列(您聲明第一個文件中只有一行數據)。

如果只有1行,則不需要while循環來讀取數據。簡單地說明一下,我如何將1行讀入變量,(split ' ', <$fh>)。

由於您似乎不需要date1time1,我將它們分配到了undef。 (undef這裏只是一個你不想捕獲的值的佔位符,我也可以使用undef作爲第一個字段,但是我將它分配給了$id,這是你不用的)。

此外,我使用了詞法文件句柄($fh,$fh2),而不是INPUTTHR,因爲這是首選的做法。我不能確切地說明它爲什麼是首選,但我認爲它是在perl v 5.6中採用的。

我還使用了3 argument,(文件句柄,模式,文件)模式打開文件。 (你使用了2個參數,3參數是在5.6版本中引入的,它更安全,形式爲open)。

#!/usr/bin/perl 
use strict; 
use warnings; 

my $input_file = 'file1'; 
my $s1_threshold="file2"; 

open my $fh, '<', $input_file 
    or die "$0: open of $input_file failed, error: $! \n"; 

my ($id, $date, $time1, undef, undef, $ne1, @cc) = split ' ', <$fh>; 

close $fh or die "$0: close of $input_file failed, error: $! \n"; 

# get hour from time1 
my $hour1 = substr $time1, 0, 2; 

open my $fh2, '<', $s1_threshold 
    or die "$0: open pf $s1_threshold failed, error: $! \n"; 

while (<$fh2>) { 
    my ($ne2, $cc, $hour2, $threshold) = split; 

    if ($hour1 == $hour2 && $ne1 eq $ne2) { 
     my $i = 0 + substr $cc, 2; 

     if ($cc[$i] > $threshold) 
     { 
      print("$cc[$i]\n"); 
      print ("match\n"); 
     } 
     else 
     { 
      print("not match\n"); 
     } 
    } 
} 
close $fh2 or die "$0: close pf $s1_threshold failed, error: $! \n"; 
+0

感謝您的答覆,ı刪除substr命令並添加拆分命令以獲取所有數據ı需要。現在,我可以正確檢索所有數據,但如果其他命令不能正常工作ı不明白爲什麼? – evenstar

+0

@evenstar你的代碼看起來像做了許多不必要的步驟 - 特別是分配給'my @ cc116 = split(',',$ satir [122]); my @ cc117 = split(',',$ satir [123]); ','等'。但是要回答你關於'if .. else'的問題,'if(@hour == @ time1)'應該和'if($ hour [0] == $ time1 [0])一起工作' –

+0

現在它起作用了正確的,你能解釋爲什麼我們這樣使用,爲什麼數組元素[0] ?.順便說一下,我不能編輯所有輸入文件,但在第一個文件中,我有2行和136列,它不僅是一行。在第二個文件中有4列和很多行。我無法弄清楚如何以簡單的方式單獨獲得127列數據,這就是爲什麼我需要manuelly分配的分割命令。 – evenstar

0

您試圖將所有的值作爲一個整數使用,這將永遠不會工作。你需要逐個獲取這些值。此外,你解析線的方式正在呼喚麻煩。你是更好的東西是這樣的:

my ($id, $date1, $time1, $date2, $time2, $ne, $cc0, $cc1, $cc2, $cc3, $cc4) = split /\s+/, $sonuc; 

現在你可以單獨使用$cc0, $cc1, ...爲整數。

+0

當我嘗試使用這樣的,所有我想從單獨讀取數據解析只有在$ id變量和其他變量,如$日期1 ...不包含任何數據,因此它不工作。 – evenstar

+0

這是因爲我將案例簡化爲空格分隔字段,但在上面的文件中,字段之間可能有多個空格或製表符。我已經編輯了答案來解釋這一點,希望有所幫助。 – palako

相關問題