2010-07-21 48 views
1

我必須解析一個文件並將其存儲在一個表中。我被要求使用散列來實現這一點。給我簡單的方法來做到這一點,只有在Perl中。如何解析此文件並將其存儲在表中?

----------------------------------------------------------------------- 
L1234| Archana20 | 2010-02-12 17:41:01 -0700 (Mon, 19 Apr 2010) | 1 line 
PD:21534/lserve<->Progress good 
------------------------------------------------------------------------ 
L1235 | Archana20 | 2010-04-12 12:54:41 -0700 (Fri, 16 Apr 2010) | 1 line 
PD:21534/Module<->Dir,requires completion 
------------------------------------------------------------------------ 
L1236 | Archana20 | 2010-02-12 17:39:43 -0700 (Wed, 14 Apr 2010) | 1 line 
PD:21534/General Page problem fixed 
------------------------------------------------------------------------ 
L1237 | Archana20 | 2010-03-13 07:29:53 -0700 (Tue, 13 Apr 2010) | 1 line 
gTr:SLC-163/immediate fix required 
------------------------------------------------------------------------ 
L1238 | Archana20 | 2010-02-12 13:00:44 -0700 (Mon, 12 Apr 2010) | 1 line 
PD:21534/Loc Information Page 
------------------------------------------------------------------------ 

我想讀這個文件,我想執行一個拆分或任何提取以下字段的表:

  • L啓動ID應該是在第一場表
  • Archana20必須在第二場
  • 時間戳必須在第三字段
  • PD必須在第四音響場
  • 類型(前/內容必須在最後一個字段)

我的問題是:

  1. 如何忽略該文件中的--------…(分割線)?
  2. 如何提取以上?
  3. 如何拆分文件有兩個分隔符(|/)?
  4. 如何使用散列來實現它,需要什麼?

請提供一些簡單的方法,以便我能夠理解,因爲我是Perl的初學者。

+1

桑德亞,歡迎堆棧溢出。我編輯了你的問題的格式,如果你不想要這個,你可以撤消它。請閱讀[編輯幫助](http://stackoverflow.com/editing-help),瞭解如何在將來在本網站上正確設置問題和答案。 – daxim 2010-07-21 10:07:52

+3

因爲這不是一個家庭作業問題,而且看起來比較複雜,所以你必須先試一試。我會發布一些代碼,至少會顯示一些嘗試。 – xenoterracide 2010-07-21 10:17:11

+0

這不是一個家庭作業...意味着這將是一個開始評估我在perl .... :( – Sandhya 2010-07-21 10:37:23

回答

1

當你說This is not a homework...to mean this will be a start to assess me in perl我假設你的意思是這也許是你在新工作或某事上的第一項任務,在這種情況下,如果我們只是給你答案,它實際上會傷害你,因爲他們會假設你比你更瞭解Perl。

但是,我會指出你正確的方向。

答:不要使用split,請使用正則表達式。你可以通過谷歌搜索「perl regex」來了解它們。 B. Google「perl hash」瞭解perl哈希。第一個結果非常好。

我們您的問題:

  1. 正則表達式會幫助你忽略行你不想
  2. 與提取項目正則表達式。查找「捕獲變量」
  3. 不要分割,使用正則表達式
  4. 請參見上面的B點。
+2

請加上尊重,但我認爲正則表達式比在'|'上先分割'/'然後再在'/'上分割最後一個字段要困難得多和容易出錯' – Telemachus 2010-07-21 11:01:40

2

我的問題是:

  1. 如何忽略-------- ...(分割線)在這個文件?
  2. 如何提取以上?
  3. 如何拆分文件有兩個分隔符(|,/)?
  4. 如何使用散列來實現它,需要什麼?
  1. 你可能會通過在一個循環中通過行的文件行工作。看看perldoc -f next。在這種情況下,您可以使用正則表達式或更簡單的匹配,以確保您只跳過適當的行。
  2. 你需要首先分割,然後根據需要處理每個字段,我猜測。
  3. 在主分隔符上分割(看起來像是'|' - 稍後會有更多內容),然後將最後一個字段分割爲次分隔符。
  4. 我不確定你是否問你是否需要散列。如果是這樣,你需要選擇哪個項目將提供最佳的(唯一的)一組密鑰。由於我們不知道你的數據,所以我們不能爲你做這件事,但第一個領域(一目瞭然)看起來是正確的。至於如何將這樣的東西變成更復雜的數據結構,最終你會想看看perldoc perldsc,儘管它現在可能只會讓你感到困惑。

另一件事,上面的數據看起來像在第一行中有一個半重要的錯字。僅在該行中,第一個字段與其分隔符之間沒有空格。在其他地方它是'| 」。我提到這只是因爲它可以爲split。我幾乎編輯了這個,但也許數據本身是不規則的,但我懷疑它。我不知道你對Perl有多少初學者,但是如果你對它完全陌生,你應該考慮一本書(在線教程差別很大,許多過時了)。一本相當不錯的入門書籍可以在線免費獲取:Beginning Perl。另一個不錯的選擇是Learning PerlIntermediate Perl(他們真的走在一起)。

1

如果這個文件是基於行的,那麼你可以在while循環中逐行讀取。然後跳過那些沒有格式化的行。

之後,您可以使用正則表達式,如其他答案中所示。我會用它來分割它並獲得一個數組,併爲記錄構建一個列表哈希。在之後(或之前)通過修剪空格等來清理每條記錄。如果使用正則表達式,則使用捕獲表達式以這種方式添加到列表中。隨你便。

散列鍵是第一列,該列表包含其他所有內容。如果你只是做一個直接插入,你可以拿出一個列表清單,然後把所有內容都放進去。

散列的關鍵將允許您查看特定記錄以進行快速查找。但如果你不需要這個,那麼一個數組就可以。

-2

你可以試試這個,

點需要知道:

  1. 一行
  2. 讀取文件中的行通過使用正則表達式,刪除 '----' 行。
  3. 之後使用拆分函數來填充數組的哈希值。

    #!/usr/bin/perl 
        use strict; 
        use warning; 
        my $test_file = 'test.txt'; 
        open(IN, '<' ,"$test_file") or die $!; 
        my (%seen, $id, $name, $timestamp, $PD, $type); 
        while(<IN>){ 
         chomp; 
         my $line = $_; 
         if($line =~ m/^-/){ #removing '---' lines 
         # print "$line:hello\n"; 
         }else{ 
         if ($line =~ /\|/){ 
          ($id , $name, $timestamp) = split /\|/, $line, 4; 
         } else{ 
         ($PD, $type) = split /\//, $line , 3; 
         } 
         $seen{$id}= [$name, $timestamp, $PD, $type]; //use Hashes of array 
         } 
        } 
        for my $test(sort keys %seen){ 
         my $test1 = $seen{$test}; 
         print "$test:@{$test1}\n"; 
        } 
        close(IN); 
    
+0

請使用詞法文件句柄和open的三參數形式。小馬和彩虹快樂 – Telemachus 2010-07-21 12:04:50

+0

我想很長一段時間,這... ...不起眼......感謝噸立即解決 – Sandhya 2010-07-21 13:03:22

+0

-0.4各種不良風格(這將圓b自己達到0),但是當他需要閱讀一些關於釣魚的書籍時,給人一條魚的比例爲-0.4。 – Ether 2010-07-21 14:42:23