Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как удалить строку, не содержащую информации?
 
 автор: Владимир55   (30.04.2013 в 19:28)   письмо автору
32.9 Кб
 
 

Каким образом можно удалить строку, в которой имеются только табуляция, пробелы и перевод строки?

На скриншоте видно, что буквально каждая строка обрабатываемого текста имеет табуляцию (и эту табуляцию убирать не надо). Но при этом имеются две совершенно пустые строки, в которых тоже есть (могут быть) пробелы и знаки табуляции. Вот эти, не содержащие информации, строки и надо удалить.

Как это можно сделать?

  Ответить  
 
 автор: confirm   (30.04.2013 в 20:17)   письмо автору
 
   для: Владимир55   (30.04.2013 в 19:28)
 

Не надо никаких регулярок:
<?
$f 
file('tab.txt'); //или разбить строку на массив по переводу, если это не файл
$a = array();
//перечислите все для str_replace, что нужно удалить
//можно использовать и trim с перечислением нужного для удаления
foreach($f as $v) if(strlen(str_replace(array("\t"," ","\r","\n"),'',$v))) $a[] = rtrim($v);
//получить готовое после удаления
echo implode("\r\n"$a);

  Ответить  
 
 автор: Владимир55   (01.05.2013 в 11:42)   письмо автору
 
   для: confirm   (30.04.2013 в 20:17)
 

Дело в том, что в данном случае обрабатываются файлы большого размера. Если считать, что хостинг имеет memory_limit 240M (для большинства хостингов это предел), то на нем можно обрабатывать файлы размером порядка 200 Мб.

Если же мы превратим строку в массив, то потребление памяти увеличится в пять раз. Соответственно, предел размера обрабатываемого файла сократится до 40-50 Мб, что весьма сократит функциональные возможности скрипта.

Другой недостаток - существенное замедление быстродействия вследствие необходимости перебора большого количества строк. С учетом пика памяти хостинг сбросит такой скрипт.

  Ответить  
 
 автор: confirm   (01.05.2013 в 11:44)   письмо автору
 
   для: Владимир55   (01.05.2013 в 11:42)
 

А вы думаете, что обработать 240 М рег. выражениями это быстрее будет? Попробуйте.
Считывайте частями, в любом случае как бы вы не обрабатывали, такие большие объемы, это делить на части. А обработать часть в десятки МБ длиной регулярными выражениями, это вообще кошмар.

  Ответить  
 
 автор: Владимир55   (01.05.2013 в 12:22)   письмо автору
 
   для: confirm   (01.05.2013 в 11:44)
 

Сто метрового файла сейчас нет под руками, а на 22 Мб ушла 1 секунда. Вот такой обработкой:

    $content = preg_replace(
        '/(?:^|(?<=[\\r\\n]))(?:\\h*(?:$|[\\r\\n]+))+/D',
        '',
        $content
    );

  Ответить  
 
 автор: Владимир55   (01.05.2013 в 13:22)   письмо автору
 
   для: Владимир55   (01.05.2013 в 12:22)
 

Считывайте частями, в любом случае как бы вы не обрабатывали, такие большие объемы, это делить на части.

Вы совершенно правы!

Проверка показала, что при использовании регулярного выражения размер потребляемой памяти удваивается. Похоже, что РНР постоянно делает копии, так что удваивается расход памяти даже при таких операциях:
$kod = file_get_contents('import.xml');
file_put_contents('import.xml', $kod);

  Ответить  
 
 автор: Sfinks   (03.05.2013 в 09:14)   письмо автору
 
   для: Владимир55   (30.04.2013 в 19:28)
 

Ничего, если я не буду читать до конца, а просто отвечу?
$s = preg_replace('#\r?\n\s*(?=\r?\n)#',"\n",$s);

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования