2013-05-16 2 views
1

Excel 파일 (xlsx 또는 xls 일 수 있음)에서 데이터를 구문 분석하려고합니다.Spreadsheet :: Read를 사용하여 perl에서 Excel 파일을 반복합니다.

내가 얻고 자하는 워크 시트는 이미 알고 있으므로, 반복하여 반복하여 데이터를 추출하고 싶습니다.

내 코드 :

Can't call method "row_range" on unblessed reference at perl/parse_test.pl line 22. 

내가 펄 매우 새로 온 사람, 아직 해시, 배열과 참조의 복잡성을 이해하지 못하는 그러나

#!/usr/bin/perl -w 

use strict; 
use warnings; 
use Spreadsheet::Read; 
use Getopt::Long; 

my $inputfile; 

GetOptions (
    'i=s' => \$inputfile, 
); 

die 'missing input file' unless $inputfile; 

my $workbook = ReadData ($inputfile, debug => 9); 
my @worksheets = (1); 
foreach (@worksheets) { 
    my $sheet = $workbook->[$_-1]; 

    next unless $sheet; 

    my ($row_min, $row_max) = $sheet->row_range(); 
    my ($col_min, $col_max) = $sheet->col_range(); 
    for my $row ($row_min .. $row_max) { 

    } 
} 

, 나는 다음을 얻을 .

@sheet->row_range 

당신은 아닌 객체의 메소드를 사용할 수 없습니다

+0

명령 줄'-w' 옵션보다 항상'경고 사용'을 사용하십시오. 둘 다 사용하는 것은 불필요합니다. – Borodin

+0

@ 보 로딘 : 팁 주셔서 감사! –

답변

3

,

my @sheet = $workbook->[$_-1]; =>my $sheet = $workbook->[$_-1];

인쇄 $sheet 참조 오류가 계속 발생하면 $sheet의 인스턴스를 확인합니다.

next unless $sheet; 
print ref($sheet), "\n"; 

그것은 당신의 데이터를 다른 방법으로 접근해야한다처럼, 이것은 당신이 $sheet->{label}$sheet에서 라벨을 읽으려면 너무 http://metacpan.org/pod/Spreadsheet::Read#Data-structure

$book = [ 
    # Entry 0 is the overall control hash 
    { sheets => 2, 
    sheet => { 
     "Sheet 1" => 1, 
     "Sheet 2" => 2, 
     }, 
    type => "xls", 
    parser => "Spreadsheet::ParseExcel", 
    version => 0.59, 
    }, 
    # Entry 1 is the first sheet 
    { label => "Sheet 1", 
    maxrow => 2, 
    maxcol => 4, 
    cell => [ undef, 
     [ undef, 1 ], 
     [ undef, undef, undef, undef, undef, "Nugget" ], 
     ], 
    A1  => 1, 
    B5  => "Nugget", 
    }, 
    # Entry 2 is the second sheet 
    { label => "Sheet 2", 
    : 
    : 
] 

에서, 등으로 본다.

+0

죄송합니다. 코드를 잘못 입력했습니다. 이미 $입니다. –

+0

질문에 "해시"라고 적어 두겠습니다. –

+0

업데이트 됨,'$ sheet'는 일반 해시이며 자체 메서드가있는 객체가 아닙니다. –

1

문제는 다음과 같다. 개체는 참조 (예 : 스칼라) 여야합니다. @이 아니라 $으로 시작해야합니다. 당신이 그것을 필요하지 않은 경우 먼저 배열을 사용하지 않는

+0

죄송합니다. 코드를 잘못 입력했습니다. 이미 $입니다. 나는 그 질문을 갱신 할 것이다. –