원래 게시물이 너무 깁니다. 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
},
}
그래서, 당신의 해시 이름은 학교 번호로 시작해야 내부 물론 해시를 가지고 :
안부,
huh ??? 코드는 위치를 지정하는 코드입니다. 모듈은 요청할 때마다 원하는 셀의 내용을 기쁜 마음으로 제공합니다. – ikegami
예. @ kailash19 그것은 내가 원하는 구조였다. 하지만 어쨌든 나는 올바른 해쉬 테이블을 만들 수 없었다. 내가'코스'셀이 키로 남아있는 행을 정의한다면, 물론 같은 행에있는 값을 잃어버린 것이라고 말하십시오. 이 예제에서는 '학교 3'의 '학교 1', '체육관'및 '음악'의 'eng'만 구문 분석 할 수 있습니다. – user2198367