Как я могу считать строки из конца файла в Perl?

это, возможно, связано с sheet.getParent().setNamedRange(sheet.getName()+'_'+x, range);, но не со строкой № 135.

Непонятно почему, и это нигде не задокументировано, но setNamedRange () иногда не позволяет иметь имена листов в строке имени диапазона. Попробуйте как-то изменить наименование диапазона.

7
задан Jon Seigel 19 March 2010 в 19:05
поделиться

9 ответов

В *отклоняют, можно использовать команду хвоста.

tail -1000 yourfile | perl ...

Это будет только для записи последние 1 000 строк к программе жемчуга.

В Windows существует gnuwin32 и unxutils пакеты, которые оба имеют tail утилита.

11
ответ дан 6 December 2019 в 04:47
поделиться

Модуль File::ReadBackwards позволяет Вам читать файл в обратном порядке. Это помогает получить последние строки N, пока Вы не зависимый порядка. Если Вы, и необходимые данные являются достаточно маленькими (которым это должно быть в Вашем случае), Вы могли считать последние 1 000 строк в массив и затем reverse это.

27
ответ дан 6 December 2019 в 04:47
поделиться

Это только мимоходом связано с Вашим основным вопросом, но когда Вы хотите проверить, если модуль, такой как работы File::Tail над Вашей платформой, проверьте результаты Тестеров CPAN. Ссылки наверху страницы модуля в Поиске CPAN приводят Вас к

file-tail-header

Смотря на матрицу, Вы видите, что действительно этот модуль имеет проблему в Windows на всей версии протестированного Perl:

file-tail-matrix

9
ответ дан 6 December 2019 в 04:47
поделиться

Без хвоста решение только для 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".

4
ответ дан 6 December 2019 в 04:47
поделиться
perl -n -e "shift @d if (@d >= 1000); push(@d, $_); END { print @d }" < bigfile.csv

Хотя действительно, то, что системы UNIX могут просто tail -n 1000 должен убедить Вас просто устанавливать cygwin или colinux

2
ответ дан 6 December 2019 в 04:47
поделиться

Вы могли использовать Связь:: модуль Файла я верю. Похоже, что это загружает строки в массив, затем Вы могли получить размер массива и обработать arrayS-ze-1000 до arraySize-1.

Связь:: Файл

Другая Опция состояла бы в том, чтобы считать количество строк в файле, затем цикл через файл однажды, и начать читать в значениях в numberofLines-1000

$count = `wc -l < $file`;
die "wc failed: $?" if $?;
chomp($count);

Это дало бы Вам количество строк (в большинстве систем.

1
ответ дан 6 December 2019 в 04:47
поделиться

Если Вы знаете количество строк в файле, можно сделать

perl -ne "print if ($. > N);" filename.csv

где N является $num_lines_in_file - $num_lines_to_print. Можно считать строки с

perl -e "while (<>) {} print $.;" filename.csv
0
ответ дан 6 December 2019 в 04:47
поделиться

Не полагаясь на хвост, который я, вероятно, сделал бы, если у Вас есть больше, чем $FILESIZE [2 ГБ?] памяти затем я просто был бы ленив и сделал бы:

my @lines = <>;
my @lastKlines = @lines[-1000,-1];

Хотя другое вовлечение ответов хвост или seek() в значительной степени способ пойти на это.

-1
ответ дан 6 December 2019 в 04:47
поделиться

Необходимо абсолютно использовать File::Tail или еще лучше другой модуль. Это не сценарий, это - модуль (программирующий библиотеку). Это, вероятно, работает над Windows. Как кто-то сказал, можно проверить это на Тестерах CPAN, или часто только путем чтения документации модуля или просто попытки ее.

Вы выбрали использование утилиты хвоста как Ваш предпочтительный ответ, но это, вероятно, будет большим количеством головной боли в Windows, чем File::Tail.

-1
ответ дан 6 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: