разбивка текста

desperado

Новичок
разбивка текста

дано:
текст с абзацами (в качестве ключа скажем комбинация символов или просто \n)
задача:
разбить его на страницы (скажем по 30, может 40 Кб), сохранив целостность абзацев, т.е. новая страница с нового абзаца. при ентом на странице могет быть несколько абзацев.

З.Ы. Впринцепе у меня решение есть, хотя для меня через ж@пу, причем большую, но работает (непроверял на больших текстах) хочется просто узнать как люди такую вещ решают
 

.des.

Поставил пиво кому надо ;-)
PHP:
$abz=explode ("\n",$big_str);
$pages=array();
$i=0;
$j=0;
while($j<count($abz))
{
 $pages[$i].=$abz[$j++];
if(strlen($pages[$i])<30000)
  $i++;
}
Что то вроде этого.. но я бы не стал повторять эту процедуру каждый раз :)
 

desperado

Новичок
а не будет ли это слишком долго при тексте в 10-20Mb?
а насчет точек разбива (номер строчки или байта) это понятно, надо просто раз разбить и сохранить.
 

.des.

Поставил пиво кому надо ;-)
а не будет ли это слишком долго при тексте в 10-20Mb
если это единоразово, то нет :) подождешь.
А если собираешься при каждом обращении к скрипту.. то конечно извращение.

а насчет точек разбива (номер строчки или байта) это понятно, надо просто раз разбить и сохранить
а что тебе мешает разбить и сохранить уже разбитые страницы в файлах?
 

ForJest

- свежая кровь
desperado а какие проблемы?
<цикл>
1. читаешь абзац - один из файла.
2. если сумма всех записанных абзацев + длина текущего> 40кб
2.1. открываешь новый "рабивочный файл"
2.2. сумма в ноль.
3. пишешь считанный в текущий "разбивочный файл"
4. прибавляешь длину абзаца к сумме.
</цикл>
 

desperado

Новичок
идея хорошая, но у меня и так файлов порядка 30.000 (документы, типа) каждый из которых всреднем 100-200 Кб. Прикинь сколько времени их бить, я думаю сервак раньше сдохнет нежели половину побьет. да потом их еще подругому хранить надо будет. сам посуди 30.000 в одном каталоге уже много, а тут 90.000-210.000. Вощем одним словом с заказчиками двинуться можно. год все устраивало а тут на тебе - Странички слишком большие, читать неудобно.
 

.des.

Поставил пиво кому надо ;-)
desperado так насчет файлов - ты же сказал 20-30 Mb
ну короче если не хочешь переразбивать то можешь и на лету формировать страницы. в принципе должно быть без тормозов (если не больше 200Kb файлы как ты говоришь).
как формировать показано выше :) при переходах будешь передавать и номер страницы.
 

desperado

Новичок
блин, со средним размером я прокАльнулся, всего текстов на 50 ГиГов +\- 100 Мб, интересно за одну ночь управиться разбить все?
 

.des.

Поставил пиво кому надо ;-)
мда... вот что происходит когда вначале сделают а потом проектируют (перепроектируют)

я думаю операцию ты проведешь быстро, вот только вопрос как на это посмотрит хостер :) потому как скрипт перелопачивающий 50 гигов это конечно прикол :)
 

desperado

Новичок
Автор оригинала: .des.
desperado так насчет файлов - ты же сказал 20-30 Mb
ну короче если не хочешь переразбивать то можешь и на лету формировать страницы. в принципе должно быть без тормозов (если не больше 200Kb файлы как ты говоришь).
как формировать показано выше :) при переходах будешь передавать и номер страницы.
ну 20-30 хрен его знает, помниться таких парочку (отчет по какойто долбаной конференции на 52 метра );) , а если их будет больше? Вобще когда я все писал то было расчитано на максимум на 500 Кб, а тут 52 метра ясен пень эксплорер заглючит.
 

desperado

Новичок
Автор оригинала: .des.
мда... вот что происходит когда вначале сделают а потом проектируют (перепроектируют)

я думаю операцию ты проведешь быстро, вот только вопрос как на это посмотрит хостер :) потому как скрипт перелопачивающий 50 гигов это конечно прикол :)
ну с хостером проблем нет, ящик почти по з@днице стоит (верней за ней), а вот юзаются инфой часто (15 отделений по миру, а спят не все разом) щаз запущу, а потом кто нить начальнику - типа не работает, а он мне - че за хрень
 

desperado

Новичок
PHP:
//ладно, сделаю проще так:

$fd = fopen ($filename, "r");
fseek($fd,$ofset[$page]);
print fread ($fd,$ofset[$page+1]-$ofset[$page]);
fclose ($fd);
 

RomikChef

Guest
Десперада.
Если тебя устроит не выводить список страниц, а только листание - следующая/предыдущая, то все елается просто.
К этому коду добавляется анализатор конца абзаца в одну строчку - и все.
 

leosha

Старожил PHPCLub
А перед любыми манимуляциями данными объемом 50Gb я бы забэкапился.
 

desperado

Новичок
2 RomikChef:
нафига, запущю скрипт, он мне найдет байты где страница кончается\начинается, и все в бд запихаю.
2 leosha:
в любом случае есть реалтайм бекап
2 Ramzes:
я и сам не доганяю, по спецификации заказа одна хрень, а на деле все используют не по назначению.
 

RomikChef

Guest
Ну, если с бд, в которую записывать концы из текстовых файлов, то я снимаю шляпу...
 
Сверху