Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8087[/thread]

zweidimensionales Array auf Leere prüfen



<< >> 5 Einträge, 1 Seite
pktm
 2006-06-16 20:15
#67406 #67406
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich habe da eine Datenstruktur, die so aussehen kann:
Quote
$VAR1 = [
         [
           bless( do{\(my $o = 34598980)}, 'Win32::OLE::Variant' ),
           '8513',
           '485/142562',
           '19',
           '2506098',
           '4',
           bless( do{\(my $o = 34599196)}, 'Win32::OLE::Variant' ),
           bless( do{\(my $o = 34591412)}, 'Win32::OLE::Variant' ),
           undef,
           undef,
           undef,
           undef,
           undef,
           undef,
           undef,
           undef,
           '29.2',
           '29.2',
           undef,
           undef
         ],
         [
           undef, undef, undef, undef, undef,
           undef, undef, undef, undef, undef,
           undef, undef, undef, undef, undef,
           undef, undef, undef, undef, undef
         ],
       [ 3mal-alles undef ], ...
       ];


Das ist eine Range()-Selektion aus Excel via Win32::OLE.
Ich möchte aus dieser Selektion die Stelle in einer Excel-Datei finden, die am Ende aller EIntragungen steht,also einfach das untere Ende.

Es gibt zwar die Möglichkeit sowas hier zu verwenden:
Code: (dl )
$Sheet->Range("A1", $Sheet->Range("A1")->End($xl->{xlDown}))->Count();

aber das hört bei der ersten Leerzeile auf zu zählen. Manchmal wird vom menschlichen Benutzer der Exceldatei zur Übersicht aber eine solche, oder auch zwei eingefügt.
Deshalb die manuelle Zählung über eine while-Schleife. Sie beginnt ab $Sheet->Range("A1", $Sheet->Range("A1")->End($xl->{xlDown}))->Count(); und prüft dann, ob nach den von Excel (?) gefundenen Zeilen noch weitere Einträge stehen (und das tun sie auch).

Jetzt möchte ich gerne über die ganze Breite abfargen, ob vier aufeinanderfolgende Zeilen leer sind.

Gibt es dafür einen einfachen Algorithmus?
Ich kann mit gerade keinen aus den Fingern saugen.
Das kniffelige besteht darin, dass man einstellen können soll, nach wieviel aufeinanderfolgenden leeren Zeilen gesucht wird (falls sich der benutzer mal entscheidet 4 Leerzeilen einzufügen).

Ideen? Gibt es scon Module mit solchen Algorithmen? Prüfen einer x-dimensionalen Datenstruktur auf definierte Werte? Vielleicht die Liste flatten und dann auf irgendwas definiertes prüfen?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Strat
 2006-06-17 14:21
#67407 #67407
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bei CPAN:Spreadsheet::ParseExcel gibt's sowas
$worksheet->{MaxRow} bzw. MaxCol...

Mit Win32::OLE habe ich auch noch keine vernuenftige Loesung gefunden (aber auch noch nicht ernsthaft versucht)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2006-06-17 21:55
#67408 #67408
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wobei das MaxRow bzw. MaxCol auch nicht immer zuverlässig funktioniert. Ich werde in den nächsten Wochen mal versuchen einen Patch dafür zu schreiben...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bo
 2006-06-19 18:04
#67409 #67409
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
versuch mal folgendes:

Code: (dl )
1
2
3
my $last_row = $sheet->UsedRange->Find( { What => "*", SearchDirection => xlPrevious, SearchOrder => xlByRows } )->{Row};

my $last_col = $sheet->UsedRange->Find( { What => "*", SearchDirection => xlPrevious, SearchOrder => xlByRows } )->{Column};
pktm
 2006-06-22 16:21
#67410 #67410
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=bo,19.06.2006, 16:04]versuch mal folgendes:

Code: (dl )
1
2
3
my $last_row = $sheet->UsedRange->Find( { What => "*", SearchDirection => xlPrevious, SearchOrder => xlByRows } )->{Row};

my $last_col = $sheet->UsedRange->Find( { What => "*", SearchDirection => xlPrevious, SearchOrder => xlByRows } )->{Column};
[/quote]
Habe es eben mal ausprobiert. Funktioniert wunderbar!
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 5 Einträge, 1 Seite



View all threads created 2006-06-16 20:15.