“状态”是否总是从后续行开始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 }, }
而不是为school2
parsing。
问题是,如果这个模块有什么灵活性,可以从我想要的地方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; }
像这样的东西,它应该工作,你可能需要根据你的要求做一些改变。