簡體   English   中英

如何使用Perl逐行讀取CR-only文件?

[英]How to read line by line a CR-only file with Perl?

我正在嘗試讀取只有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>;

有關詳細信息,請參閱perldoc perlvar

另一種適用於各種換行符的解決方案是立即對整個文件進行啜食,然后使用正則表達式將其拆分為多行:

local $/ = undef;
my $content = <FILE>;
my @lines = split /\r\n|\n|\r/, $content;

但是,對於非常大的文件,您不應該這樣做,因為文件完全被讀入內存。 請注意,將$ /設置為未定義的值會禁用行分隔符,這意味着在文件結束之前一直讀取所有內容。

我解決了一個可能在這里有用的更普遍的問題:

如何逐行解析大文件與任何行分隔符(CR / 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM