Я хочу конвертировать excel-файлы в csv-файлы с помощью Perl. Для удобства я хотел бы использовать модуль File :: Slurp для операций чтения/записи. Мне нужно это в подфункции.Perl - пустые строки при записи CSV из Excel
При печати на экране программа генерирует желаемый результат, созданные csv-файлы, к сожалению, содержат только одну строку с точкой с запятой, поле пуст.
Вот код:
#!/usr/bin/perl
use File::Copy;
use v5.14;
use Cwd;
use File::Slurp;
use Spreadsheet::ParseExcel;
sub xls2csv {
my $currentPath = getcwd();
my @files = <$currentPath/stage0/*.xls>;
for my $sourcename (@files) {
print "Now working on $sourcename\n";
my $outFile = $sourcename;
$outFile =~ s/xls/csv/g;
print "Output CSV-File: ".$outFile."\n";
my $source_excel = new Spreadsheet::ParseExcel;
my $source_book = $source_excel->Parse($sourcename)
or die "Could not open source Excel file $sourcename: $!";
foreach my $source_sheet_number (0 .. $source_book->{SheetCount} - 1)
{
my $source_sheet = $source_book->{Worksheet}[$source_sheet_number];
next unless defined $source_sheet->{MaxRow};
next unless $source_sheet->{MinRow} <= $source_sheet->{MaxRow};
next unless defined $source_sheet->{MaxCol};
next unless $source_sheet->{MinCol} <= $source_sheet->{MaxCol};
foreach my $row_index (
$source_sheet->{MinRow} .. $source_sheet->{MaxRow})
{
foreach my $col_index (
$source_sheet->{MinCol} .. $source_sheet->{MaxCol})
{
my $source_cell =
$source_sheet->{Cells}[$row_index][$col_index];
if ($source_cell) {
print $source_cell->Value, ";"; # correct output!
write_file($outFile, { binmode => ':utf8' }, $source_cell->Value, ";"); # only one row of semicolons with empty fields!
}
}
print "\n";
}
}
}
}
xls2csv();
Я знаю, что есть что-то делать с передачи параметров в функции write_file, но никак не удавалось зафиксировать его.
Есть идеи?
спасибо, что заранее.
Добавить 'use strict; использовать предупреждения; 'и сообщать об ошибках/предупреждениях, которые вы получаете. Я думаю, что 'use v5.14' активирует строгие, но не предупреждения ... но используйте их обоих, чтобы быть уверенными. – TLP
Вам следует знать, что вы рискуете перезаписать исходные файлы с помощью строки '$ outFile = ~ s/xls/csv/g'. В Windows '<*.xls>' будет соответствовать чему-то вроде 'foo.XLS', но ваше регулярное выражение чувствительно к регистру и не будет выполнять подстановку, поэтому ваши имена входов и выходов будут одинаковыми. Используйте '/ i', чтобы игнорировать регистр. – TLP
Спасибо за подсказку с чувствительным к регистру. Я добавил использование строго; использовать предупреждения; Единственное предупреждение, которое я получаю, это «Широкий символ в печати на линии etl.pl 45». Но это потому, что в моих файлах есть такие символы, как «ö». – royskatt