“状态”是否总是从后续行开始parsing?

原始post太长: 使用Spreadsheet :: ParseExcel在XLS文件中获取零个单元格

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 

作为imranbuild议,我使用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 ,它开始parsing从第二行。 也就是说,如果我们声称当然是一个状态,并且从下一行开始处理,直到它到达下一个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(); } 

但是,它只能parsing

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

而不是为school2parsing。

问题是,如果这个模块有什么灵活性,可以从我想要的地方parsing出来吗?

最好的祝福,

我认为你需要像下面这样的结构,而不是上面提到的结构:

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

所以,你的哈希名称应该从学号开始,里面有所有提供的课程和里面的键值对。

这样,你就可以很容易地parsing它。

编辑:

你可以改变你的代码是这样的(我不知道你做这件事的确切方式):

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

像这样的东西,它应该工作,你可能需要根据你的要求做一些改变。