Здравствуйте. Помогите решить проблему. PHP учу ток что не пинайте сильно. Итак. Есть текстовик в 25000 строк. Надо разбить его на куски по 150 строк. Читаю из файла в массив норм. Выбираю из масива 150 строк норм тоже. запись тож проходит. А вот как это все зациклить? Как сделатб чтоб в конце файла скрипт остановился? И как сделать чтоб имя файла увелтчивалось само. Типа 1.txt 2.txt и тд? Код вот: PHP: <? $test = file ("mapa.txt"); $arr=array_slice($test, 0, 150); $tst=fopen("map.html","w"); $arr=serialize($arr); fwrite ($tst, $arr); ?>
PHP: <?php $filename = "mapa.txt"; $big_content = file($filename); $omfg = array_chunk($big_content, 150); foreach($omfg AS $key=>$sentences){ $new_file = ($key+1).".txt"; $open_file = fopen($new_file, "w"); $new_content = implode("\n\r", $sentences); fwrite($open_file, $new_content); fclose($open_file); } ?>
Спасибо большое. Работает. А можно пояснения если не трудно). Я пытался поставить в имя файла ++$var и не получалось.
Вообще, здесь все очень просто, даже не знаю, как объяснить. Но, если честно, то я сомневаюсь в правильности этого кода — есть подозрение, что для работы с огромными файлами, существуют специальные функции и методы. Ибо делать массив из 25 тысяч элементов это очень сурово ))) PHP: <?php $filename = "mapa.txt"; // — твой файл с 25 тысячами строк $big_content = file($filename); // — массив с 25-ю тысячами элементаов. $omfg = array_chunk($big_content, 150); // — функция array_chunk() делит массив на несколько массивов. (Кстати, нужно написать не 150, а 149). В нашем случае, получилось ~167 элементов (25000 делим на 150) в массиве $omfg, а в кажом из этих 167-и элементов еще 150 элементов. // Напиши здесь вот это — print_r($omfg); — сразу станет понятно. foreach($omfg AS $key=>$sentences){ // — делаем одно и то же действие 167 раз. Перебираем массив 167 раз. Ну, форэч он и в Африке форэч. $new_file = ($key+1).".txt"; // — $key++ неподходит, потому что тогда имена файла будут начинаться с нуля, а нам надо с единицы. Поэксперементируй. $open_file = fopen($new_file, "w"); // — создаем файл 1.txt и открываем его для записи $new_content = implode("\n\r", $sentences); // — берем 150 строчек и сливаем их в одну строчку, разделенную на "\n\r". Кстати, поиграйся с этими "\n\r". fwrite($open_file, $new_content); // — пишем в файл наши 150 строк fclose($open_file); } // Должно получиться примерно 167 файликов. ?>
Никаких забиваний в массив, читаем файл построчно и напрямую записываем. Пишу пример: PHP: <?php $handle = fopen('map.txt', 'r'); $times = 1; while(!feof($handle)) { $writer = fopen("part_{$times}.txt", 'w+'); for($i = 1; $i <= 150; $i++) { fwrite($writer, fgets($handle)); } fclose($writer); $times++; } fclose($handle); ?> Проверено на файле в 1 000 000 строк с убранным таймаутом. Скрипт не упал, правда файлы я потом запарился удалять.
Работать будет медленней, чем первый вариант, ибо открывание/закрывание файла 150 раз это ппц. Массив из 25 тыщ элементов — тоже ппц, но работает быстрее. Оба варианта ужасны.
Интересно, а у вас файл меньше раз открывается? =) У меня хотя бы лишней памяти не используется на массивы.
Да, меньше Посчитайте. 167 раз. А у вас — 167 умножить на 150. Да, этим и хорош ваш код. А вообще, есть подозрение, что уже изначально есть ошибка в архитектуре приложения. Файл называется «mapa.txt» — карта «А» — скорее всего там какие-то географические координаты, ну, или другая инфа. Но она должна явно храниться где-нить в базе и уже выбираться оттуда, явно с каким-нить условием. А парень просто нашел где-то текстовый файл и пытается его использовать.
Люди. Не ругайтесь. Мара.тхт это карта сайта в текстовом формате. Просто надо было разделить.Если брать хтмл то тогда еще и гемор с тегами будет. Я сгенерил софтинкой хтмл и сохранил в текстовик. Просто еще не могу делать выборку из бд. А можно тогда еще вопрос? Как паралельно в каждый файл писать основные хтмл теги? (<head><title></title></head>)и тд. Догадываэсь над определить переменые и туда так же в цикле пихать. А вот как реализовать. Х3.
Поясните, что значит как?. Функции записи не знаете или что? Тэги - это тот же текст, так же записывается в файл, как и любой другой текст. PHP: $prefix = '<html><head><title></title></head><body>'; $postfix = '</body></html>'; fwrite($open_file, $prefix .$new_content .$postfix);
Кстати норм прошло деление. делил на денвере. Процесс прошел секунд за 20. Так что думаю до предела еще далеко.)))) Спасибо за помощь.
Вообщем, окей. Но есть подозрение, что что-то у тебя очень медленно работает. Я только что взял фалик (словарь синонимов.txt) — там 19 000 строк. Весь процесс занял 0.15095710754395 секунд — получился 121 файлик. Попробовал методом Apple сделать — процесс занял 0.17317390441895 секунд, 121 файлик. У тебя 20 секунд — это чересчур много. Хотя если уже разделил то забей, это я просто пишу, самому интересно стало, откуда так много секунд на выполнение взялось