Удалить повторные строки php
//удаляет из файла file.txt все одинаковые строки
set_time_limit(0);
$file=»file.txt»;
$infa=file(«$file»);
echo count($infa),»
«;
$_file=file($file);
$_file=array_values(array_unique($_file));
echo «Unique strings =»,$i,»
«;
echo «done
«; flush();
fclose($fp);
Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 66 bytes) in /home/. /clear.php on line 8
Цитата:
А подскажи как это написать? я не очень силён в PHP |
в данном случае в лоб, с последующей оптимизацией.
в лоб — берешь первую строку и пробегаешься по остальным, ища тоже самое
(для оптимизации можно брать не одну).
прошелся, если есть, то эту строку не пишешь в новый файл, если нет, то пишешь..
берешь следующий блок и тоже самое.
Читаем первую строку и записываем ее в новый файл.
Читаем вторую строку — и проверяем нет ли этой строки в новом файле.. если нету — дописываем в новый файл. если есть — не пишем.
Берем третью строку и проверяем нет ли ее в новом файле. если нету — дописываем в новый файл. есть есть — не пишем.
Хотя наверное ты это и имел ввиду =))
Цитата:
Хотя наверное ты это и имел ввиду =)) |
тоже самое, только наоборот. вопрос только в том, где будет меньше лишних считываний.
1. Загоняем строки в массив
2. Удаляем не уникальные
3. Сохраняем массив
Курим бамбук или что покрепче.
Можно join — тогда еще короче будет.
1. Создаем хэш, его и каждую строку вешаем ключен, а значение инкрементируем. $strings++
Таким образом получаем уникальные строки и количество каждой.
2. Дерево. Берем n строчек файла(допустим первые 5000), ищем уникалы, сохраняем во временный, далее следующие n и т.д., после завершение цикла обрабатываем первым методом временный файл.
set_time_limit(0) — решение не особо хорошее, после висения скрипта n минут погонят с хостинга, к гадалке не ходи (это если настройки сервера вообще позволят выполнить такой канделябр).
Цитата:
Прежде чем отвечать ты сначала вчитайся в приведенный код и найди отличия . |
Цитата:
Еще можно создать БД mysql |
А если нет доступа к серверу БД?
Как вариант, можно создать пустой хеш, связать его с db файлом, и все.. будет очень быстро и красиво. )
Наверно это самый оптимальный вариант, чтобы не ломать мозги.
А вообще задача интересная.
Может быть из исходного файла сделать отсортированный? А потом уже легко убить дубли? Но тогда выходной файл будет также отсортирован, оно нам надо?
Давайте предложим каждый по варианту, а потом посмотрим чей будет быстрее?
Задача.
Скриптом на PHP или Perl убить повторяющиеся строки в большом файле.
Добавлено:
Кстати, файл 400000 записей я заполнил md5 хешами случайных чисел от 1 до 2000, и что интересно, 12 мегабайтный файл без повторений стал размером 65 кб
Вот тебе и псевдослучайность
Ну вот например:
исходный файл = 5 013 547 байт
после удаления дубликатов = 4 620 837 байт
повторяем операцию получаем файл = 4 767 335 байт
повторяем операцию получаем файл = 5 013 547 байт
В файлах добавляется больше пустых строк между урлами, как это исправить?
Код:
$fw=fopen(‘out.txt’,’w’); $fr=fopen(‘test.txt’,’r’); while (!feof($fr)) < $str = fgets($fr, 4096); $curpos=ftell($fr); if (check_string($str,$fr)) else > fclose($fr); fclose($fw); function check_string($str,$fp) < while (!feof($fp)) < $strf = fgets($fp, 4096); if ($strf==$str) return true; > return false; > ?> |
ед, что вроде зацикливается где то после обработки..щас гляну
ну да, на границе..
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Скрипт для удаления одинаковых строк из файла |
Реклама на форуме Ru.Board.
Powered by Ikonboard «v2.1.7b» © 2000 Ikonboard.com Modified by Ru.B0ard © Ru.B0ard 2000-2023 Как удалить дубликаты строк Как удалить дубликаты из массива Удалить дубликаты из многомерного массива Как регулярками удалить дубликаты строк? Как из Таблице Paradox удалить дубликаты строк функцией file вогнать файл в массив, функцией array_unique удалить не уникальные значения если файл больше 1 мб, можно построчно проверять Сообщение от ytf функцией file вогнать файл в массив, функцией array_unique удалить не уникальные значения site_all_image.rar 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $filename = 'site_all_image.txt'; $input = file($filename); $result = array_unique($input); $fp = fopen($filename , 'a'); foreach ($result as $value) { if (!empty($value)) { //$fp = fopen($filename , 'a'); fwrite($fp, $value."\r\n"); //fclose($fp); } } fclose($fp); ?> Удалить повторяющиеся строкиУдалить не повторяющиеся элементы массива Как удалить повторяющиеся символы в строке? Как удалить повторяющиеся пробелы в тексте? я бы дела так: считал в два массива строк, потом бы в цикле сравнивал, и если найдутся совпадения, то удалял бы из второго массива Сообщение от V@D!k Сообщение от vip72 Сообщение от vip72 Сообщение от KOPOJI имелось в виду предварительное array_merge, забыл написать. Хотя да, вариант неверный в итоге, удалятся только дубли, исходные останутся file_put_contents( './file2.txt', array_diff( file('./file1.txt', FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES) file('./file2.txt', FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES) ) ); Сообщение было отмечено vip72 как решение Решение1 2 3 4 5 6 7 8 9 10 11 12 # Получаем данные из файлов $data1 = file('file1.txt', FILE_IGNORE_NEW_LINES); $data2 = file('file2.txt', FILE_IGNORE_NEW_LINES); # Сличаем массивы $result = array_diff($data2,$data1); # Разбиваем назад в строку $result = implode("\n", $result); # Записываем в файл file_put_contents('file2.txt', $result); А то, что мой код малёхо длиньше, чем у KOPOJI, ещё ничего не значит :umbrage: ну у меня и записывает в одну строку без пробела, и массивы «наоборот» 🙂 Добавлено через 47 секунд file_put_contents( './file2.txt', join( PHP_EOL, array_diff( file('./file2.txt', FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES), file('./file1.txt', FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES) ) ) ); KOPOJI, позвольте Вас поправить :). Добавлено через 45 секунд Опоздал. KOPOJI сам осознал свою ошибку :D. Добавлено через 2 минуты А вот что я использовал \n заместо PHP_EOL — это мой грешок :D. Сообщение от lyod Сообщение от V@D!k Как удалить повторяющиеся элементы двух массивов? Убрать повторяющиеся строки при записи в файл С++ Удалить повторяющиеся строки Удалить повторяющиеся строки как удалить повторные строки в двухмерном массивехочу удалить дублированные строки и сделать вот так но это бред( помогите .. может есть какаято функция типа array_unique или подскажите алгоритм.. спасибо заранее 25 декабря 2008 г. 11:09, спустя 27 минут 51 секунду Если я правильно понял из названия темы, то речь идет о вложенных массивах. Тогда: 25 декабря 2008 г. 11:25, спустя 16 минут 20 секунд Пожалуйста, авторизуйтесь, чтобы написать комментарий! |