У меня есть очень большой текстовый файл. Надо оттуда корректно считать данные и отделить друг от друга, следующим образом Код (Text): {post} Заголовок 1 Автор 1 Текст 1 {post} Заголовок 2 Автор 2 Текст 2 . . . {post} Заголовок n Автор n Текст n т.е. взять заголовок 1 обработать, взять автора-обработать, наконец взять оставшийся текст и тоже обратотать и так далле до следующего {post} и начать обработку заново и так до конца файла Заголовок и автор будут всегда на разных сторках, а текст это следующего {post} я начал дело, но до конца ни ума, ни опыта не хватает PHP: $fr = fopen( $filename, 'r') or die ("Error! Couldn't open the file.<br>"); while( !feof($fr) ) { $line = fgets($fr); if(trim($line) == "{post}") { // обработка...... } } Правильно ли я подошел к реализации или нет?
Если так как у тебя в примере: между ТЕКСТ n и {POST} всегда есть пустая строка пробелов и в самом ТЕКСТ n подобной строки точно не встретиться, то правильно. В //обработка нужно заключить проверку, которая при нахождении строки пробелов собственно закончит обработку Весь блок //обработка - корректнее вынести в отдельную функцию.
строка {post} будет встречатся только отдельно. так у меня возник вопрос, допустим я обработал материал, то потом как начать поиск не с самого места разьеденния, а с места где я закончил обработку и еще... как правильно реализовать поиск уже в самом отдельно взятом куске материала?
Все зависит от того, куда вы обрабатываете - в массив, в БД, может в другие файлы... Что вы понимаете под МЕСТОМ РАЗЪЕДИНЕНИЯ и местом, где вы ЗАКОНЧИЛИ ОБРАБОТКУ?
nurbek Не совсем понял структуру, но надеюсь, что понял правильно. PHP: <?php $file = file_get_contents("text.txt"); //берем файл в строку $data = explode("{post}", $file); //Получаем массивы с текстами $data_size = sizeof($data); //А теперь обрабатываем каждый текст for ($i = 1; $i < $data_size; $i++) { //Здесь именно начало с 1, т.к. у нас первой строкой идет {post}, то до нее пустота считается 0 элементном $parts = explode("\r\n", trim($data[$i]), 3); //Разбиваем тексты на заголовок, автора и текст //Можно так: list($title, $author, $text) = explode("\r\n", $data[$i], 3); $texts[$i]["title"] = $parts[0];// (или $title) $texts[$i]["author"] = $parts[1]; $texts[$i]["text"] = $parts[2]; } ?> Результат: [sql] Array ( [1] => Array ( [title] => Заголовок 1 [author] => Автор 1 [text] => Текст 1 ) [2] => Array ( [title] => Заголовок 2 [author] => Автор 2 [text] => Текст 2 ) [3] => Array ( [title] => Заголовок n [author] => Автор n [text] => Текст n ) ) [/sql]
В данный момент не где Будет возможность посмотрю обязательно. ...а понял, не увидел с ходу последний параметр 3.
Kreker говорит Вообще то этот скрипт преднозначался для автоматического обновления контента, т.е. вместо того чтобы 100 статей тыкать в Tinymce, мы просто решили написать это в файл и потом загрузить файл в базу.
nurbek Я думаю, что получившийся массив куда легче будет забить в базу простым циклом... Или должна быть определенная периодичность?
to Сreker нет не надо никакой периодичнсти, да Вы правы мы прям в FOR-е и будем забивать. Спасибо за код, но я чуть подправил т.к. text выводится без ENTER-ов: PHP: <?php $filename = trim($_POST['filename']); $file = file_get_contents($filename); //берем файл в строку $data = explode("{post}", $file); //Получаем массивы с текстами $data_size = sizeof($data); //А теперь обрабатываем каждый текст //Здесь именно начало с 1, т.к. у нас первой строкой идет {post}, то до нее пустота считается 0 элементном for ($i = 1; $i < $data_size; $i++) { $parts = explode("\r\n", trim($data[$i]), 3); //Разбиваем тексты на заголовок, автора и текст $texts[$i]["title"] = $parts[0];// (или $title) $texts[$i]["author"] = $parts[1]; $texts[$i]["text"] = $parts[2]; $texts[$i]['text'] = explode("\r\n", trim($texts[$i]['text'])); echo "<strong>Title</strong>: ".$texts[$i]['title']."<br>"; echo "<strong>Author</strong>: ".$texts[$i]['author']."<br>"; echo "<strong>Text</strong>: <br>"; for($j = 0; $j < sizeof($texts[$i]['text']); $j++) { echo $texts[$i]['text'][$j]."<br>"; } echo "<br>"; } ?> Вопрос: Как Вы думаете различны ли будут нагрузки на БД при таком вводе через файл, чем при вводе через Tinymce, если бы мы вводили текст одинакового же размера?[/b]
nurbek На самом деле это лишнее. Не нужно разбивать текст на массив, чтобы потом снова превратить массив в текст. Достаточно заменить \r\n в тексте на <br> с помощью функции strtr. А вообще, для таких целей есть функция nl2br, поэтому, строку $texts[$i]["text"] = $parts[2]; можно превратить в : $texts[$i]["text"] = nl2br($parts[2]); Вообще, стоит ли рассматривать нагрузку на бд при заполнении её инфой? Просто скрипт быстро закидает базу инфой с максимальной нагрузкой, а tinymce - надо будет вручную тыкать + он еще много обрабатывает текст...