2013-04-23 72 views
0

原帖是太長了:Fetching zero cells in XLS file using Spreadsheet::ParseExcel'狀態'是否總是開始從後續行解析?

xls的數據結構。文件看起來像下面:

 col1  col2 col3 col4 col5 
row1 School 1 
row2 Dean  John 
row3 No.stu. 55 
row4 some irrelevant stuff 
row5 School2 2 
row6 Dean  Tony 
row7 No. stu. 60 
row8 some irrelevant stuff 
row9 School 3 
row10 Dean  James 
row11 No.stu. 56 
row12 No. teacher 20 
row13 School 4 
row14 Dean  Tom 
row15 No.stu. 79 
row16 No. teacher 21 
row17 course  
row18   math 2 
row19   eng  4  
row20 teacher name age gender race 
row21   Jane 20 female white 
row22 student name Lee 
row23   SAT  1434 
row24   gender male 

作爲imran建議,我使用以下結構使用Spreadsheet :: ParseExcel;

my %data; 
    my $state = ""; 
    my $school = ""; 
    my $student = ""; 
    my ($row_min, $row_max) = $worksheet->row_range(); 
    my $row = $row_min; 
    while ($row <= $row_max) { 
     my $cell0 = $worksheet->get_cell($row, 0); 
     my $cell1 = $worksheet->get_cell($row, 1); 

     if (defined($cell0)) { 
      my $key = $cell0->value(); 
      if ($key eq 'School') { 
       $state = 'school'; 
       $school = $cell1->value(); 
      } elsif ($key eq 'course') { 
       $state = 'course'; 
      } elsif ($key eq 'teacher') { 
       $state = 'teacher'; 
      } elsif ($key eq 'student') { 
       $state = 'student'); 
       $student = $worksheet->get_cell($row, 2)->value(); 
      } else { 
       $data{$school}{$key} = $cell1->value(); 
      } 
     } elsif ($state eq 'course') { 
      # process columns for course 
     } elsif ($state eq 'teacher') { 
      # process columns for teacher 
     } elsif ($state eq 'student') { 
      # process columns for student 
     } 
     $row++; 
    } 

它工作得很好。

但似乎在每個state,它開始從第二行解析。也就是說,如果我們聲稱當然是一個狀態,並且它從下一行開始處理,直到它到達下一個state。然而,如果例如,過程狀態具有用於每個學校略微不同的數據結構,即鍵和用於state當然值之一是在同一行中,

 School 1 
    course math  
       eng 
    ... 
    School  2 
    course phy 
    ... 
    School  3 
    course chem 
       gym 
       music 

如果我粘到原始代碼使用:

} elsif ($key eq 'course') { 
       $state = 'course'; 
       $course = $worksheet->get_cell($row, 1)->value(); 
    } 

和相應散列表爲:

} elsif ($state eq 'course') { 
      my $key = $cell1->value(); 
      $data{$school}{$course}{$key} =$cell1->value(); 
} 
然而

,它只能解析

'1' => { 
        'math' => { 
           'eng' => 'eng' 
          }, 
     } 
'3' => { 
    'chem' => { 
           'gym' => 'gym', 
           'music' => 'music 
          }, 
     } 

而且沒有爲school2解析。

問題是,如果這個模塊有任何靈活性,可以從我想要的地方解析出來嗎?

最好的問候,

+0

huh ??? ???您的代碼是指定位置的代碼。該模塊將隨時爲您提供您需要的任何單元格的內容。 – ikegami 2013-04-23 07:08:14

+0

是的。 @ kailash19這是我想要的結構。但不知何故,我無法做出正確的哈希表。比如說,如果我定義了「課程」單元格作爲關鍵字所在的行,我當然會丟失同一行中的值。在這個例子中,我只能從'school 1','gym'和'music'解析'eng'到'school 3'。 – user2198367 2013-04-23 07:57:17

回答

2

我認爲你需要像下面的結構,而不是一個上面提到的:

'1' => { 
       'course' => { 
          'math' => 'math' 
          'eng' => 'eng' 
         }, 
    } 
'3' => { 
       'course' => { 
          'chem' => 'chem' 
          'gym' => 'gym', 
          'music' => 'music 
         }, 
    } 

所以,你的哈希名應以學號開始,裏面當然有哈希併爲所有課程提供關鍵價值對。

這樣,您將可以很輕鬆地解析它。

編輯:

您可以更改您的代碼是這樣的(我不知道你在做它的確切方式):

} elsif ($key eq 'course') { 
      $state = 'course'; 
      $course = $state; 
      $key = $worksheet->get_cell($row, 1)->value(); 
      $data{$school}{$course}{$key} = $key; 
} 

事情是這樣的,它應該工作,你可能必須根據您的要求做一些更改。

相關問題