读取perl中的大文件,按记录记录,使用动态记录分隔符

时间:2011-01-13 17:09:27

标签: perl performance file-io

我有一个逐行读取大文件的脚本。我想要使​​用的记录分隔符($/)是(\n)。唯一的问题是每行的数据都包含CRLF字符(\r\n),该程序不应被视为一行的结尾。

例如,这是一个示例数据文件(写出换行符和CRLF):

line1contents\n
line2contents\n
line3\r\ncontents\n
line4contents\n

如果我设置$/ = "\n",那么它会将第三行拆分为两行。理想情况下,我可以将$/设置为匹配\n而不是\r\n的正则表达式,但我不认为这是可能的。另一种可能性是读入整个文件,然后使用split函数拆分所述正则表达式。唯一的问题是文件太大而无法加载到内存中。

有什么建议吗?

3 个答案:

答案 0 :(得分:6)

对于这个特殊的任务,检查你的行结尾听起来非常简单,并根据需要追加下一行:

$/ = "\n";
...
while(<$input>) {
    while( substr($_,-2) eq "\r\n" ) {
        $_ .= <$input>;
    }
    ...
}

这与用于在许多不同编程上下文中支持line continuation的逻辑相同。

你是对的,你不能将$/设置为正则表达式。

答案 1 :(得分:1)

dos2unix将把一个UNIX换行符放入“\ r \ n”中,因此不会真正解决问题。我会使用一个正则表达式,用空格或制表符替换所有“\ r \ n”的实例,并将结果保存到不同的文件(因为你不想在这些点分割线)。然后我会在新文件上运行你的脚本。

答案 2 :(得分:0)

首先尝试在文件上使用dos2unix,然后正常读取。