Leser: 28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use File::Copy;
...
...
while ( my $excel = readdir(EXCELFILES) ) {
if ( $excel =~ /xls/ ) {
extractXLS(....); # produziert ein txt-File in $directory_txt
}
}
my @filecopy = ("a.txt","b.txt","c.txt","d.txt");
foreach my $file (@filecopy ) {
# erst starten, wenn extractXLS abgeschlossen ist
copy($directory_txt.$file,$directory_txtcopy.$file) or die "File cannot copied";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use Spreadsheet::ParseExcel;
sub extractXLS {
# parameter
my $exceldir = shift;
my $excelfile = shift;
my $OUTPUT = shift;
my $wksh = shift;
binmode( $OUTPUT,":utf8" );
# begin
my $oBook = Spreadsheet::ParseExcel::Workbook->Parse($exceldir.$excelfile);
my($iR, $iC, $oWkS, $oWkC);
my $oWkS = $oBook->worksheet($wksh);
#print "--------- SHEET:", $oWkS->{Name}, "\n";
for( my $iR = $oWkS->{MinRow} ;
defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++
)
{
my $rec='';
for(my $iC = $oWkS->{MinCol} ;
defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++
) {
my $temp = '';
$oWkC = $oWkS->{Cells}[$iR][$iC];
$temp = $oWkC->Value if($oWkC);
$rec = $rec.$temp.";";
}
chop($rec);
$rec = $rec,"\r";
print $OUTPUT $rec,"\n";
}
}
print $OUTPUT $rec, "\r\n";
my($iR, $iC, $oWkS, $oWkC);
$rec = $rec,"\r";
1 2 3 4 5 6 7 8 9 10 11 12
return unless(defined($oWkS->{MaxRow})); for my $iR ( $oWkS->{MinRow}..$oWkS->{MaxRow} ) { my @list=(); next unless(defined($oWkS->{MaxCol})); for my $iC ($oWkS->{MinCol}..$oWkS->{MaxCol}) { my $oWkC = $oWkS->{Cells}[$iR][$iC]; push(@list,$oWkC?$oWkC->Value:''); } print $OUTPUT join(';',@list)."\r\n"; }
2010-02-17T15:32:16 LinuxerDer Handle wir - so wie ich den Code interpretiere - als Parameter an die Subroutine übergeben... stammt also von außerhalb der Routine...
2010-02-17T15:46:30 reneeJa, hast recht. Sorry.
$| = 1
QuoteAuf dem derzeit aktiven Handle wird ein AutoFlush aktiviert.
1 2 3 4 5 6
use IO::Handle; STDOUT->autoflush(1); open my $fh, '>', 'asd.txt' or die $!; $fh->autoflush(1);
QuoteIn jedem Fall ist das Verwenden von Methoden auf Dateihandles auch für Anfänger nachvollziehbarer als kryptische setzen globaler $-Variablen.
1 2 3 4 5 6
# STDOUT hat hier Puffer aktiviert for my ( @list ) { STDOUT->printflush('.'); sleep 1; } # STDOUT hat hier Puffer aktiviert
QuoteEine Frage noch dazu bitte: Wenn ich eine main.pl habe, die weitere *.pl's require'd, muss ich dann in jeder require'ten *.pl IO::Handle use'n und autoflush'en oder reicht das im Hauptprogramm einmalig?
Guest giordanoHallo,
Ich habe eine Subroutine extractXLS() geschrieben, das aus Excel-Files eine Text-Datei erstellt. Diese Text-Datei wird anschliessend kopiert in ein anderes Verzeichnis. Nun ist mir aufgefallen, dass die kopierte Version nicht alle Zeile enthält und ich vermute, dass der Kopiervorgang bereits begonnen hat, bevor die Subroutine abgeschlossen war. Wie kann ich den Kopiervorgang erst dann starten, wenn die Subroutine abgeschlossen ist?
Code: (dl )1
2
3
4
5
6
7
8
9
10
11
12
13
14use File::Copy;
...
...
while ( my $excel = readdir(EXCELFILES) ) {
if ( $excel =~ /xls/ ) {
extractXLS(....); # produziert ein txt-File in $directory_txt
}
}
my @filecopy = ("a.txt","b.txt","c.txt","d.txt");
foreach my $file (@filecopy ) {
# erst starten, wenn extractXLS abgeschlossen ist
copy($directory_txt.$file,$directory_txtcopy.$file) or die "File cannot copied";
}
Bin für jeden Tipp dankbar.
Gruss
giordano
1 2 3 4 5
use warnings; use strict; use Spreadsheet::Excel2Text qw( XlsSaveToText ); XlsSaveToText("C:\\Excel.xls", "C:\\Excel.txt");
1 2
my @filecopy = ("a.txt","b.txt","c.txt","d.txt"); foreach my $file (@filecopy ) {