最初に Stack Overflow の質問Using Spreadsheet::WriteExcel を参照してください。
データ構造は次のようになります。
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
私が達成したい出力は次のとおりです。
col1 col2 col3 col4 col5 col6 col7 col8 col9
row1 School Dean No.stu. No. teacher course_math course_eng teacher_name teacher_age teacher_gender teacher_race student_name student_SAT student_gender
row2 1 John 55
row3 2 Tony 60
row4 3 James 56 20
row5 4 Tome 79 21 2 4 Jane 20 female white Lee 1434 male
そして、gangabass のおかげで、私が与えられたコードは次のとおりです。
use strict;
use warnings;
use Spreadsheet::ParseExcel;
use FindBin qw($Bin);
my ($infile) = @ARGV;
my $parser = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse("$Bin/Test.xls");
die $parser->error unless defined $workbook;
my ($worksheet) = $workbook->worksheets();
my %data;
my $row = 0;
my $school = "";
while (1) {
my $cell = $worksheet->get_cell($row, 0);
last unless defined($cell);
my $key = $cell->value();
my $value = $worksheet->get_cell($row++, 1)->value();
if ($key eq "School") {
$school = $value;
next;
}
$data{$school}->{$key} = $value;
}
sleep 1;
row17-row19 の解析から始めます。最初に遭遇した問題は、(row17, col3) の空のセルでした。コードがここに到達するとエラーが発生します。Excel セルが「空」と「空白」を区別することを知っているので、元の XLS ファイルのセル形式を「一般」以外に設定することで、それをいじることができます。ただし、これは一時的な解決策にすぎません。空のセルを取得するために使用できるコマンドがあるかどうか疑問に思います。私はすでにunformatted()
追加してみました:
my $unformattedvalue = $worksheet->get_cell( $row++, 1 )->unformatted();
しかし、うまくいきません。
次に、次のコードを使用して「コース」状態でデータ構造を指定しようとしました。
my %data;
my $row = 0;
my $school = "";
my $course = ""; #Initial value for the state of course
while (1) {
my $cell = $worksheet->get_cell($row, 0);
last unless defined($cell);
my $key = $cell->value();
my $value = $worksheet->get_cell( $row++, 1 )->value();
my $value1 = $worksheet->get_cell( $row++, 2 )->value(); #Fetching the value in column 3
if ($key eq "School") {
$school = $value;
next;
}
if ($key eq "course") { #Just mimicking the how we construct the structure of 'School'
$course = $value1;
next;
}
$data{$school}->{$key} = $value; #Must be something wrong here, but can not figure out
}
コードが通過せず、Can't call method "value" on an undefined value at xxx line of 'my $value1 = $worksheet->get_cell( $row++, 2 )->value()';
要するに、私の質問は次のとおりです。
- 一般に、プロセスに介入せずに XLS で空のセルを取得するにはどうすればよいですか?
Spreadsheet::ParseExcel を使用して次のような構造を解析するにはどうすればよいですか
row17 course row18 math 2 row19 eng 4