2013-04-23 1 views
0

원래 게시물이 너무 깁니다. Fetching zero cells in XLS file using Spreadsheet::ParseExcel'state'는 항상 후속 행에서 구문 분석을 시작합니까?

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 

, 내가 스프레드 시트를 사용하여 다음과 같은 구조 :: 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에 대한 구문 분석이 없습니다.

내가 원하는 곳에서 구문 분석 할 수있게 해주는이 모듈의 융통성이 있다면?

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

그래서, 당신의 해시 이름은 학교 번호로 시작해야 내부 물론 해시를 가지고 :

안부,

+0

huh ??? 코드는 위치를 지정하는 코드입니다. 모듈은 요청할 때마다 원하는 셀의 내용을 기쁜 마음으로 제공합니다. – ikegami

+0

예. @ kailash19 그것은 내가 원하는 구조였다. 하지만 어쨌든 나는 올바른 해쉬 테이블을 만들 수 없었다. 내가'코스'셀이 키로 남아있는 행을 정의한다면, 물론 같은 행에있는 값을 잃어버린 것이라고 말하십시오. 이 예제에서는 '학교 3'의 '학교 1', '체육관'및 '음악'의 'eng'만 구문 분석 할 수 있습니다. – user2198367

답변

2

나는 당신이 다음과 같은 구조가 아니라 위에서 언급 한 필요가 있다고 생각 제공되는 모든 과목에 대한 핵심 가치 쌍이 있습니다.

이렇게하면 나중에 매우 쉽게 구문 분석 할 수 있습니다.

편집 :

가 당신이 (난 당신이 그 일을 정확한 방법으로 잘 모릅니다)이 같은 뭔가 코드를 변경할 수 있습니다

:

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

뭔가하고 작업을해야 당신이 수도 귀하의 요구 사항에 따라 몇 가지 변경을해야합니다.