Perl 如何读取具有不同行分隔符的大型文件?

Perl 如何读取具有不同行分隔符的大型文件?,perl,Perl,我有两个非常大的XML文件,它们有不同的行尾。 文件A在每个XML记录的末尾都有CR LF。文件B在每个XML记录的末尾只有CR 为了正确读取文件B,我需要将内置Perl变量$/设置为“\r”。 但是如果我对文件A使用相同的脚本,脚本不会读取文件中的每一行,而是将其作为一行读取 如何使脚本与具有各种行尾分隔符的文本文件兼容?在下面的代码中,脚本读取XML数据,然后使用正则表达式根据特定的XML标记拆分记录,如结束标记。最后,它将请求的记录写入一个文件 open my $file_handle,

我有两个非常大的XML文件,它们有不同的行尾。 文件A在每个XML记录的末尾都有CR LF。文件B在每个XML记录的末尾只有CR

为了正确读取文件B,我需要将内置Perl变量$/设置为“\r”。 但是如果我对文件A使用相同的脚本,脚本不会读取文件中的每一行,而是将其作为一行读取

如何使脚本与具有各种行尾分隔符的文本文件兼容?在下面的代码中,脚本读取XML数据,然后使用正则表达式根据特定的XML标记拆分记录,如结束标记。最后,它将请求的记录写入一个文件

 open my $file_handle, '+<', $inputFile or die $!;  
local $/ = "\r";
while(my $line = <$file_handle>) { #read file line-by-line. Does not load whole file into memory.
    $current_line = $line;

    if ($spliceAmount > $recordCounter) { #if the splice amount hasn't been reached yet
        push (@setofRecords,$current_line); #start adding each line to the set of records array
        if ($current_line =~ m|$recordSeparator|) { #check for the node to splice on
            $recordCounter ++; #if the record separator was found (end of that record) then increment the record counter
        }
    } 
    #don't close the file because we need to read the last line

}
$current_line =~/(\<\/\w+\>$)/;
$endTag = $1;
print "\n\n";
print "End Tag: $endTag \n\n";

close $file_handle;

打开我的$file_句柄,”+如果文件不是太大而无法保存在内存中,您可以将整个文件拼成一个标量,并使用适当灵活的正则表达式将其拆分为正确的行。比如说,

local $/ = undef;
my $data = <$file_handle>;
my @lines = split /(?>\r\n)|(?>\r)|(?>\n)/, $data;
foreach my $line (@lines) {
    ...
}
local$/=undf;
我的$data=;
my@lines=split/(?>\r\n)|(?>\r)|(?>\n)/,$data;
foreach my$行(@行){
...
}

使用先行断言
(?>…)
会像常规的
操作符一样保留行尾字符。如果你只是想吃掉它们,你可以通过将
/\r\n |\r\124;\ n/
传递到
split
来节省一个步骤。

如果文件不是太大而无法保存在内存中,你可以将整个文件拼成一个标量,然后自己用一个适当灵活的正则表达式将其拆分成正确的行。比如说,

local $/ = undef;
my $data = <$file_handle>;
my @lines = split /(?>\r\n)|(?>\r)|(?>\n)/, $data;
foreach my $line (@lines) {
    ...
}
local$/=undf;
我的$data=;
my@lines=split/(?>\r\n)|(?>\r)|(?>\n)/,$data;
foreach my$行(@行){
...
}

使用先行断言
(?>…)
会像常规的
操作符一样保留行尾字符。如果您只是想咀嚼它们,您可以通过将
/\r\n |\r\124;\ n/
传递到
拆分
来节省一步。

虽然理论上,您可能不需要它来解析.xml,但您应该使用xml解析器。我建议您还是从开始吧。

虽然从理论上讲,您可能不需要它来解析.xml,但您应该使用xml解析器。我建议您还是从开始吧。

您因为假设XML文件在合理的位置甚至有换行符而受到惩罚。这是为了分发的,所以我不想用模块来解决这个问题。这是否意味着我不得不用Perl以外的更好地支持XML解析的语言重新编写它?你因为假设一个XML文件在合理的位置甚至有换行符而受到惩罚。这是为了分发,所以我不想用模块把它拖下水。这是否意味着我不得不用Perl以外的语言重新编写这个脚本,以更好地支持XML解析?是的,我可以使用它,但这个脚本是为了共享的,我不希望其他人下载模块来运行它。是的,我可以使用它,但是这个脚本是为了共享的,我不希望其他人下载模块来运行它。