[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как разбить большой кусок текста на несколько частей
chem1
Есть несколько распознаных книг загнаных в SQL, 1 книга - одна строка в таблице (id и text)
как привыводе на сайте сделать постаничное разбиение, наример первые 10 kb страница 1, вторые 10 kb страница 2 и т.д.?
или предложите что-либо другое. Цель одна - из 1 огромной страницы сделать много мелких



Спустя 14 минут, 17 секунд (18.05.2008 - 14:34) Ghost написал(а):
1-й вариант хранить постранично в базе - id книги, № страницы, текст
2-й вариант - вставить в текст теги типа <page> и разбивать по ним

1-й лучше

Спустя 4 часа, 15 минут, 4 секунды (18.05.2008 - 18:49) chem1 написал(а):
Цитата(Ghost @ 18.5.2008, 11:34) [snapback]38709[/snapback]
1-й вариант хранить постранично в базе - id книги, № страницы, текст
2-й вариант - вставить в текст теги типа <page> и разбивать по ним

1-й лучше


Это имеется ввиду выгрузить из SQL книгу, разрезать руками на 500 частей (в книге более 500 страниц) и каждую отдельную страницу загрузить обратно?
Вариант конечно хороший, но по времени не подходит, хочется в этом году закончить smile.gif


Спустя 18 минут, 53 секунды (18.05.2008 - 19:08) Ghost написал(а):
можешь разрезать програмно.. кто мешает-то..

Спустя 2 минуты, 46 секунд (18.05.2008 - 19:11) chem1 написал(а):
Цитата(Ghost @ 18.5.2008, 16:08) [snapback]38727[/snapback]
можешь разрезать програмно.. кто мешает-то..


есть программа?

Спустя 3 минуты, 49 секунд (18.05.2008 - 19:14) Sylex написал(а):
Цитата(chem1 @ 18.5.2008, 23:11) [snapback]38728[/snapback]
Цитата(Ghost @ 18.5.2008, 16:08) [snapback]38727[/snapback]
можешь разрезать програмно.. кто мешает-то..


есть программа?


так напиши ее! Поставь задачу хоть для начала конкретно smile.gif

Спустя 4 минуты, 1 секунда (18.05.2008 - 19:18) Sylex написал(а):
Цитата(Ghost @ 18.5.2008, 18:34) [snapback]38709[/snapback]
1-й вариант хранить постранично в базе - id книги, № страницы, текст
2-й вариант - вставить в текст теги типа <page> и разбивать по ним

1-й лучше


кстати, эта таблица будет кросс-таблицей?

Спустя 10 минут, 38 секунд (18.05.2008 - 19:29) sergeiss написал(а):
Цитата(chem1 @ 18.5.2008, 15:20) [snapback]38708[/snapback]
Есть несколько распознаных книг загнаных в SQL, 1 книга - одна строка в таблице (id и text)
как привыводе на сайте сделать постаничное разбиение, наример первые 10 kb страница 1, вторые 10 kb страница 2 и т.д.?
или предложите что-либо другое. Цель одна - из 1 огромной страницы сделать много мелких

Я не вижу глобальной проблемы с самим принципом, если честно говорить... Для начала считываешь информацию в переменную, затем определяешь ее длину, затем вырезаешь нужный кусок... Выводишь его на странице, создаешь ссылки для перехода вперед-назад...
Проблема только в том, что если в одном поле - целая книга, то ты будешь каждый раз грузить компьютер большой и ненужной задачей.
Это я про алгоритм говорил smile.gif
Можно изначально разбить текст на отдельные записи нужно длины. Правда, если захочется потом не по 10, а по 15 КБ выводить, то придется покувыркаться немного, переделывая БД smile.gif
Можно сделать компромиссный вариант: одна запись - одна глава из книги. А уже потом считываешь целую главу в переменную, вырезаешь из нее кусок и показываешь пользователю.

Или проблема в том, что не можешь это оформить на PHP?

Спустя 9 минут, 34 секунды (18.05.2008 - 19:39) Ghost написал(а):
sergeiss, не, ну если уж делать - то культурно, чтоб небыло пол-слова на одной странице, и пол-слова на другой.. а это, пардон требует интеллектуального алгоритма, и во-первых, помимо базы ты еще и проц нагрузишь, а во-вторых алгоритм становится хрупким, и нестабильным. попробуй прикинь реализацию перехода с 5-й страницы на 6-ю

Sylex, смотря что ты понимаешь под "кросс-таблицей"

Спустя 3 минуты, 3 секунды (18.05.2008 - 19:42) chem1 написал(а):
Цитата(Sylex @ 18.5.2008, 16:14) [snapback]38729[/snapback]
так напиши ее!


к сожалению моих знаий для этого будет явно не достаточно sad.gif

Цитата(Sylex @ 18.5.2008, 16:14) [snapback]38729[/snapback]
Поставь задачу хоть для начала конкретно smile.gif


Есть 400 kb текста, его нужно выложить на сайт, с разбиением по страницам (например 100 страниц по 4kb)
Задача - сделать это максимально просто с минимальными временными затратами.

Моя мысль была какая - загоняем текст в стороку таблицы SQL (собственно это уже сделано)
Далее из php файла с помощью SQL запроса вытаскиваем первые 4kb, затем с помощью paginator-а следующие 4kb и т.д.
Это технически сделать возможно?

Спустя 3 минуты, 1 секунда (18.05.2008 - 19:45) Sylex написал(а):
Цитата(Ghost @ 18.5.2008, 23:39) [snapback]38732[/snapback]
Sylex, смотря что ты понимаешь под "кросс-таблицей"


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

Спустя 2 минуты, 1 секунда (18.05.2008 - 19:47) Ghost написал(а):
технически - возможно, http://phpclub.ru/mysql/doc/string-functions.html
вот только как-то это через ....

Спустя 5 минут, 9 секунд (18.05.2008 - 19:52) Ghost написал(а):
Sylex, по моему - это вопрос исключительно определений.

Спустя 15 секунд (18.05.2008 - 19:52) Sylex написал(а):
Цитата(chem1 @ 18.5.2008, 23:42) [snapback]38733[/snapback]
Есть 400 kb текста, его нужно выложить на сайт, с разбиением по страницам (например 100 страниц по 4kb)
Задача - сделать это максимально просто с минимальными временными затратами.

Моя мысль была какая - загоняем текст в стороку таблицы SQL (собственно это уже сделано)
Далее из php файла с помощью SQL запроса вытаскиваем первые 4kb, затем с помощью paginator-а следующие 4kb и т.д.
Это технически сделать возможно?


Ничего сложного. В цикле берешь первую часть (4 Кб) и вставляешь в БД с номером 1, берешь вторую часть (4 Кб) и вставляешь в БД с номером 2. SQL так хорошо не знаю, я сделал бы через PHP алгоритм..

Фактически нужен алгоритм разделения строки на участки, где учесть, что слово нельзя делить, или даже делить по предложению ближайшему.

А если через SQL, то вот прекрасная функция:
LOCATE(substr,str,pos) - Возвращает позицию первого вхождения подстроки substr в строку str, начиная с позиции pos. ОООччень очень примерно (с ошибками в синтаксисе, потому что я его не знаю, нужно копать)):

Код
SELECT Count(id) as COL FROM MyBooks;
FOR J IN 1..COL LOOP
  FOR I IN 0..LENGTH(data)/4000-1 LOOP
    SELECT SUBSTRING(data, LOCATE('. ', data, I*4000)+2, 3998) as d FROM MyBooks WHERE id=J;
    INSERT INTO NewTable(id_book, num_page, text) VALUES (J, I, d);
  END LOOP;
END LOOP;


т.е. ищем начиная с ( 4000 * номер страницы ) символов искать точку с пробелом, типа наверняка это - предложение. И начиная с предложения "выдираем" строку в 4000 символов.

Спустя 2 минуты, 50 секунд (18.05.2008 - 19:55) chem1 написал(а):
Цитата(Ghost @ 18.5.2008, 16:47) [snapback]38735[/snapback]
вот только как-то это через ....


согласен, но мои знания в программировании не позволят мне сделать все по человечески sad.gif
если поможете, то я с удовольствием wink.gif

Спустя 1 минута, 51 секунда (18.05.2008 - 19:57) sergeiss написал(а):
Цитата(Ghost @ 18.5.2008, 20:39) [snapback]38732[/snapback]
sergeiss, не, ну если уж делать - то культурно, чтоб небыло пол-слова на одной странице, и пол-слова на другой.. а это, пардон требует интеллектуального алгоритма, и во-первых, помимо базы ты еще и проц нагрузишь, а во-вторых алгоритм становится хрупким, и нестабильным. попробуй прикинь реализацию перехода с 5-й страницы на 6-ю

Смотря какой алгоритм ты имеешь ввиду smile.gif Я их тут много набросал...

Можно, наверное, так сделать. Завести еще одну таблицу, в которой прописать, с какого по какой символы из записи для определенной книги считать определенную страницу (всего-то 4 небольших поля: идентификатор книги, номер первого символа, номер последнего символа или их количество, и номер страницы). Запускаем один раз программу с тем самым "интеллектуальным" алгоритмом, а потом просто тупо используем полученные данные.
И тогда переход с одной страницы на другую делается легко и просто smile.gif Если я не прав, готов ловить тухлые помидоры. rolleyes.gif

PS. А вся интеллектуальность алгоритма разбиения - найти пробел и резать по нему, а не в середине слова. И при таком подходе можно всегда легко и быстро перестроить данные, если потребуется другой объем для вывода на каждом шаге. Потому что сами данные будут целостные, изменится только (условно говоря) индексация.

Спустя 11 минут, 41 секунда (18.05.2008 - 20:08) Ghost написал(а):
Цитата
PS. А вся интеллектуальность алгоритма разбиения - найти пробел и резать по нему, а не в середине слова. И при таком подходе можно всегда легко и быстро перестроить данные, если потребуется другой объем для вывода на каждом шаге. Потому что сами данные будут целостные, изменится только (условно говоря) индексация.

цифры с 5-й по 6-ю не просто так возникли smile.gif
смотри, берем 1-ю страницу (ну допустим по 1000 символов), отсекаем хвост - остаётся 997 символов.
при выводе 2-й страницы (это, кстати, заново запущенный скрипт) в котором передаём параметр $page=2 мы с какого символа всё это выводить будем.. с 1000-го или возвращаться обратно, считать где закончиласть 1-я..
а на 25-й?
не, ну можно конечно в урле не страницу, а номер символа передавать, но лично я с такого урла афигею smile.gif

а по поводу 1-й части - не легче ли его действительно один раз запустить так, чтоб он побил страницы и сохранил их в новую таблу?

Sylex по точке кстати тоже не рекомендую ловить - возможны сокращения типа г. кг. руб. м. км. и т.д. smile.gif

Спустя 7 минут, 42 секунды (18.05.2008 - 20:16) Sylex написал(а):
Цитата(Ghost @ 19.5.2008, 0:08) [snapback]38741[/snapback]
Sylex по точке кстати тоже не рекомендую ловить - возможны сокращения типа г. кг. руб. м. км. и т.д. smile.gif


я это понимаю, но по другому не вижу как... пусть где-то будут исключения smile.gif

Спустя 3 минуты, 33 секунды (18.05.2008 - 20:20) Ghost написал(а):
как вариант - по точке, пробелам + регистр следующей буквы.. регуляркой соответствующей. тоже не 100% попадание однако, т.к след. может идти имя собственное. smile.gif

Спустя 7 месяцев, 22 дня, 14 часов, 58 минут, 37 секунд (11.01.2009 - 12:18) novice написал(а):
В базе есть сообщения, в данном коде вывожу 30 сообщении на страницу а сообщении гораздо больше, как мне вывести 30 сообщении на одной странице, потом нажать цифру 2 и вывести продолжение с 31 страницы по 60 и.т.д.?
PHP
<?
$query ="SELECT * FROM `table` WHERE `status`= 'checked' ORDER BY id DESC  limit 30";
$result mysql_query($query) or die(mysql_error());
while(
$row mysql_fetch_assoc($result))
{
?>
<table>
<tr>
<td>
<?
echo "".$row['content']."";
?>
</td>
</tr>
</table>
<?
}

Спустя 8 часов, 43 минуты, 10 секунд (11.01.2009 - 21:01) kirik написал(а):
novice, это делается с помощью установки смещения в запросе, тоесть LIMIT 0, 30 покажет 30 записей с нулевой. Чтобы перейти на следующую страницу нужно написать LIMIT 30, 30, тогда покажется 30 записей с 30-й записи. 3-я страница будет выглядеть так - LIMIT 60, 30 (с 60-й записи вывести 30 штук итд).
Остается подумать над алгоритмом пагинации =)

Спустя 4 минуты, 42 секунды (11.01.2009 - 21:06) sergeiss написал(а):
Цитата (kirik @ 11.01.2009 - 21:01)
novice
Остается подумать над алгоритмом пагинации =)

И что самое прикольное, подобных свежих тем на форуме несколько штук сейчас имеется tongue.gif

Спустя 9 часов, 10 минут, 51 секунда (12.01.2009 - 06:17) novice написал(а):
Всё, спасибо, нашёл, попробовал, вроде как заработало.


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.