|
 32.9 Кб |
|
| Каким образом можно удалить строку, в которой имеются только табуляция, пробелы и перевод строки?
На скриншоте видно, что буквально каждая строка обрабатываемого текста имеет табуляцию (и эту табуляцию убирать не надо). Но при этом имеются две совершенно пустые строки, в которых тоже есть (могут быть) пробелы и знаки табуляции. Вот эти, не содержащие информации, строки и надо удалить.
Как это можно сделать? | |
|
|
|
|
|
|
|
для: Владимир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);
|
| |
|
|
|
|
|
|
|
для: confirm
(30.04.2013 в 20:17)
| | Дело в том, что в данном случае обрабатываются файлы большого размера. Если считать, что хостинг имеет memory_limit 240M (для большинства хостингов это предел), то на нем можно обрабатывать файлы размером порядка 200 Мб.
Если же мы превратим строку в массив, то потребление памяти увеличится в пять раз. Соответственно, предел размера обрабатываемого файла сократится до 40-50 Мб, что весьма сократит функциональные возможности скрипта.
Другой недостаток - существенное замедление быстродействия вследствие необходимости перебора большого количества строк. С учетом пика памяти хостинг сбросит такой скрипт. | |
|
|
|
|
|
|
|
для: Владимир55
(01.05.2013 в 11:42)
| | А вы думаете, что обработать 240 М рег. выражениями это быстрее будет? Попробуйте.
Считывайте частями, в любом случае как бы вы не обрабатывали, такие большие объемы, это делить на части. А обработать часть в десятки МБ длиной регулярными выражениями, это вообще кошмар. | |
|
|
|
|
|
|
|
для: confirm
(01.05.2013 в 11:44)
| | Сто метрового файла сейчас нет под руками, а на 22 Мб ушла 1 секунда. Вот такой обработкой:
$content = preg_replace(
'/(?:^|(?<=[\\r\\n]))(?:\\h*(?:$|[\\r\\n]+))+/D',
'',
$content
);
|
| |
|
|
|
|
|
|
|
для: Владимир55
(01.05.2013 в 12:22)
| | Считывайте частями, в любом случае как бы вы не обрабатывали, такие большие объемы, это делить на части.
Вы совершенно правы!
Проверка показала, что при использовании регулярного выражения размер потребляемой памяти удваивается. Похоже, что РНР постоянно делает копии, так что удваивается расход памяти даже при таких операциях:
$kod = file_get_contents('import.xml');
file_put_contents('import.xml', $kod);
|
| |
|
|
|
|
|
|
|
для: Владимир55
(30.04.2013 в 19:28)
| | Ничего, если я не буду читать до конца, а просто отвечу?
$s = preg_replace('#\r?\n\s*(?=\r?\n)#',"\n",$s);
|
| |
|
|
|