это, возможно, связано с sheet.getParent().setNamedRange(sheet.getName()+'_'+x, range);
, но не со строкой № 135.
Непонятно почему, и это нигде не задокументировано, но setNamedRange () иногда не позволяет иметь имена листов в строке имени диапазона. Попробуйте как-то изменить наименование диапазона.
В *отклоняют, можно использовать команду хвоста.
tail -1000 yourfile | perl ...
Это будет только для записи последние 1 000 строк к программе жемчуга.
В Windows существует gnuwin32 и unxutils пакеты, которые оба имеют tail
утилита.
Модуль File::ReadBackwards позволяет Вам читать файл в обратном порядке. Это помогает получить последние строки N, пока Вы не зависимый порядка. Если Вы, и необходимые данные являются достаточно маленькими (которым это должно быть в Вашем случае), Вы могли считать последние 1 000 строк в массив и затем reverse
это.
Это только мимоходом связано с Вашим основным вопросом, но когда Вы хотите проверить, если модуль, такой как работы File::Tail над Вашей платформой, проверьте результаты Тестеров CPAN. Ссылки наверху страницы модуля в Поиске CPAN приводят Вас к
Смотря на матрицу, Вы видите, что действительно этот модуль имеет проблему в Windows на всей версии протестированного Perl:
Без хвоста решение только для Perl не состоит в том что неблагоразумно.
Один путь состоит в том, чтобы искать от конца файла, затем считать строки из него. Если Вы не имеете достаточного количества строк, ищете еще больше от конца и попробовали еще раз.
sub last_x_lines {
my ($filename, $lineswanted) = @_;
my ($line, $filesize, $seekpos, $numread, @lines);
open F, $filename or die "Can't read $filename: $!\n";
$filesize = -s $filename;
$seekpos = 50 * $lineswanted;
$numread = 0;
while ($numread < $lineswanted) {
@lines = ();
$numread = 0;
seek(F, $filesize - $seekpos, 0);
<F> if $seekpos < $filesize; # Discard probably fragmentary line
while (defined($line = <F>)) {
push @lines, $line;
shift @lines if ++$numread > $lineswanted;
}
if ($numread < $lineswanted) {
# We didn't get enough lines. Double the amount of space to read from next time.
if ($seekpos >= $filesize) {
die "There aren't even $lineswanted lines in $filename - I got $numread\n";
}
$seekpos *= 2;
$seekpos = $filesize if $seekpos >= $filesize;
}
}
close F;
return @lines;
}
P.S. Лучший заголовок был бы чем-то как "Чтение строк от конца большого файла в Perl".
perl -n -e "shift @d if (@d >= 1000); push(@d, $_); END { print @d }" < bigfile.csv
Хотя действительно, то, что системы UNIX могут просто tail -n 1000
должен убедить Вас просто устанавливать cygwin или colinux
Вы могли использовать Связь:: модуль Файла я верю. Похоже, что это загружает строки в массив, затем Вы могли получить размер массива и обработать arrayS-ze-1000 до arraySize-1.
Другая Опция состояла бы в том, чтобы считать количество строк в файле, затем цикл через файл однажды, и начать читать в значениях в numberofLines-1000
$count = `wc -l < $file`;
die "wc failed: $?" if $?;
chomp($count);
Это дало бы Вам количество строк (в большинстве систем.
Если Вы знаете количество строк в файле, можно сделать
perl -ne "print if ($. > N);" filename.csv
где N является $num_lines_in_file - $num_lines_to_print. Можно считать строки с
perl -e "while (<>) {} print $.;" filename.csv
Не полагаясь на хвост, который я, вероятно, сделал бы, если у Вас есть больше, чем $FILESIZE [2 ГБ?] памяти затем я просто был бы ленив и сделал бы:
my @lines = <>;
my @lastKlines = @lines[-1000,-1];
Хотя другое вовлечение ответов хвост
или
seek()
в значительной степени способ пойти на это.
Необходимо абсолютно использовать File::Tail или еще лучше другой модуль. Это не сценарий, это - модуль (программирующий библиотеку). Это, вероятно, работает над Windows. Как кто-то сказал, можно проверить это на Тестерах CPAN, или часто только путем чтения документации модуля или просто попытки ее.
Вы выбрали использование утилиты хвоста как Ваш предпочтительный ответ, но это, вероятно, будет большим количеством головной боли в Windows, чем File::Tail.