Как читать строку по линии файла только CR PERL?
-
26-09-2019 - |
Вопрос
Я пытаюсь прочитать файл, который имеет только CR как линейный разделитель. Я использую Mac OS X и Perl v.5.8.8. Этот скрипт должен работать на каждой платформе, для каждого вида линейного разделителя (CR, LF, CRLF).
Мой текущий код следующий:
open(FILE, "test.txt");
while($record = <FILE>){
print $record;
}
close(TEST);
Это в настоящее время печатает только последнюю строку (или худшую). Что происходит? Очевидно, я хотел бы не преобразовать файл. Является ли это возможным?
Решение
Вы можете установить разделитель, используя специальную переменную $/
:
local $/ = "\r" # CR, use "\r\n" for CRLF or "\n" for LF
my $line = <FILE>;
Видеть Перльвар Перльвар для дополнительной информации.
Другое решение, которое работает со всеми видами свободных разрядов, было бы сразу захватывать весь файл, а затем разделить его в строки, используя Regex:
local $/ = undef;
my $content = <FILE>;
my @lines = split /\r\n|\n|\r/, $content;
Вы не должны делать это с очень большими файлами, хотя файл полностью прочитан в памяти. Обратите внимание, что установка $ / к неопределенному значению отключает разделитель линии, что означает, что все прочитано до конца файла.
Другие советы
Я решил более общую проблему, которая может быть полезной здесь:
Как разбираться в анализе большого файла в строке с любой строкой разделитель (CRLF / LF), но заранее неизвестно.
«Большой» файл означает, что он не в порядке, чтобы прочитать весь файл в одну переменную. Здесь функция «detecteNDOFLINE» получает имя файла и возвращает либо « R», либо ' n', что, что используется для концов линии (она искала « R» или « n» символ Char-by-char, начиная с конец файла).
my $file = "test.txt";
local $/ = detectEndOfLine($file);
open(IN, $file) or die "Can't open file \"$file\" for reading: $!\n";
while(<IN>) {
s/\r\n|\n|\r$//;
print "$_\n";
}
sub detectEndOfLine {
my $file = $_[0];
my $size = -s $file;
print "\"$size\"\n";
open(IN, $file) or die "Can't open file \"$file\" for reading: $!\n";
for(my $i = $size; $i >= 0; --$i) {
seek(IN, $i, 0);
$_ = <IN>;
my $sym = substr($_, 0, 1);
return $sym if( $sym eq "\n" or $sym eq "\r" );
}
return undef;
}