Чтение большого файла в perl, запись за записью, с разделителем динамических записей - PullRequest
1 голос
/ 13 января 2011

У меня есть скрипт, который читает большой файл построчно. Разделитель записей ($/), который я хотел бы использовать: (\n). Единственная проблема состоит в том, что данные в каждой строке содержат символы CRLF (\r\n), которые программа не должна считать концом строки.

Например, вот пример файла данных (с выписанными символами новой строки и CRLF):

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

Если я установлю $/ = "\n", то третья строка будет разбита на две строки. В идеале я мог бы просто установить $/ в регулярное выражение, которое соответствует \n, а не \r\n, но я не думаю, что это возможно. Другая возможность - прочитать весь файл, а затем использовать функцию split для разделения на регулярное выражение. Единственная проблема заключается в том, что файл слишком велик для загрузки в память.

Есть предложения?

Ответы [ 3 ]

6 голосов
/ 13 января 2011

Для этой конкретной задачи довольно просто проверить окончание строки и, при необходимости, добавить следующую строку:

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

Это та же логика, которая используется для поддержки продолжения строки в ряде различных контекстов программирования.

Вы правы, что не можете установить $/ для регулярного выражения.

1 голос
/ 13 января 2011

dos2unix поместил бы символ новой строки UNIX для "\ r \ n" и поэтому не решил бы проблему.Я бы использовал регулярное выражение, которое заменяет все вхождения "\ r \ n" символом пробела или табуляции и сохраняет результаты в другом файле (поскольку вы не хотите разбивать строку в этих точках).Тогда я бы запустил твой скрипт на новом файле.

0 голосов
/ 13 января 2011

Попробуйте сначала использовать dos2unix для файла, а затем прочитать как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...