Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Удалить похожие (не идентичные) строки из файла

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
PakaKepstr
Отправлено: 05 Сентября, 2014 - 17:27:16
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Сент. 2014  


Помог: 0 раз(а)




Всем доброго времени суток, помогите с таким заданием. Есть файл txt в нем строки не идентичные но похожие url.com/123/ree1, url.com/123/ree2, url2.com/123/ree1. Необходимо удалить строки в которых первые допустим 10 символов равны первым 10 символам следующей строки, с сохранением 1 строки, если пропуск строки то переход к следующей строке. С меня лучи добра в карму Подмигивание

p.s. Можете пнуть в нужном направлении функции substr_replace или игры с включением строк в массив с последующим каким то образом unsetom значений ключей.

(Отредактировано автором: 05 Сентября, 2014 - 17:47:42)

 
 Top
dcc0
Отправлено: 05 Сентября, 2014 - 18:57:16
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Вроде работает:
PHP:
скопировать код в буфер обмена
  1.   $handle = fopen("f.txt", "r");
  2.     $handl1 = fopen("f1.txt", "w");
  3.  
  4. while (!feof($handle)) {
  5.     $buffer = fgets($handle);
  6.        
  7.  $buffer2 = fgets($handle);
  8.  
  9.   $a=substr($buffer, 0, 10);
  10.    $b=substr($buffer2, 0, 10);
  11.    
  12. if($a!==$b) {
  13. echo "$a not equal $b";
  14. fwrite($handl1, "$buffer");
  15.  fwrite($handl1, "$buffer2");
  16. }
  17. else {
  18.  fwrite($handl1, "$buffer");
  19. }
  20.  
  21.    }
  22.  fclose($handle);
  23. fclose($handl1);
  24.  
  25. ?>
  26.  


Т.е., допустим, строки в файле идут так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. url.com/123/ree3
  3. url.com/123/ree4
  4. Something else
  5. else Something
  6.  

Вырежет вторую строку.
За один проход уберет 1 строку, но ты сам просил:
Цитата:
с сохранением 1 строки,
Улыбка

Опционально добавляем переименование:
PHP:
скопировать код в буфер обмена
  1.  rename("f.txt", "old_f.txt");
  2. rename("f1.txt", "f.txt");
  3.  


Идея заключается в том, чтобы читать из одного файла дважды. Две переменные в цикле, одна "отстает" от другой, обе обрезаются до 10 символов и сравниваются. Запись происходит в другой файл, потом можно переименовать...
Я мог ошибиться, надо тестировать еще.
(Добавление)
Собственно вот. И здесь уже можно выбрать, что писать в файл после else, buffer или buffer2,
т.е. либо четные, либо нечетные строки.

Но только пока не учел, что между строк могут быть пустые строки. Т.е если файл такой:

CODE (htmlphp):
скопировать код в буфер обмена
  1. url.com/123/ree1
  2. url.com/123/ree3
  3. цйуйцлроу
  4. 12341234
  5.  
  6. йцдвово
  7. 123213



Первым проходом цикле можно удалить пустые стоки.

(Отредактировано автором: 05 Сентября, 2014 - 20:56:29)



-----
Март 2021. Бросил программирование
 
 Top
PakaKepstr
Отправлено: 05 Сентября, 2014 - 20:57:37
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Сент. 2014  


Помог: 0 раз(а)




Да получилось, Спасибше огромное Улыбка Вот только оно сравнивает первую строку с следующей и все а если значений одной строки больше чем 2 url.com/123/ree1, url.com/123/ree2, url.com/123/ree3, url.com/123/ree4, а надо что бы в живых осталась только первая строка Улыбка На ответ не надеюсь и так подсобили попробую сам допилить )
p.s Хотя если я тут найду после неудачи правильный вараинт будет тоже клево Улыбка
 
 Top
dcc0
Отправлено: 05 Сентября, 2014 - 21:52:07
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Промежуточные размышления. Можно не читать:

Спойлер (Отобразить)

(Добавление)

Итог всей эпопеи.

У нас есть файл f.txt. В нем есть пустые и повторяющиеся строки:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 1234567
  3.  
  4. 1234567
  5.  
  6. 1234567
  7. 1234567
  8. asdfghj
  9.  



Скрипт, который ниже под спойлером, приведет его к виду:




Сам скрипт:

Спойлер (Отобразить)

(Добавление)
Последний нюанс. Если у нас файл f.txt такого вида:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 123456
  3.  
  4. 123456
  5.  
  6. 123456
  7. asdfghj
  8. 123456
  9.  


то преобразование будет таким:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 123456
  3. asdfghj
  4. 123456
  5.  

Так как сравниваются только ближайшие строки. Все, вроде бы...

(Отредактировано автором: 06 Сентября, 2014 - 08:56:38)



-----
Март 2021. Бросил программирование
 
 Top
PakaKepstr
Отправлено: 05 Сентября, 2014 - 23:30:11
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Сент. 2014  


Помог: 0 раз(а)




Да волшебство вышло. Буду разбирать этот пример, так как то что я себе сначала на листе на программировал позорно и очень быстро было отправлено в корзину. Большое человеческое спасибо, надеюсь когда то дойти до уровня решения таких задач в такие сжатые сроки Не понял
 
 Top
dcc0
Отправлено: 05 Сентября, 2014 - 23:39:36
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




PakaKepstr Не за что.
В завершение хочу сказать, что поиск и удаление пустых строк - это все еще открытая проблема. Я считаю, что решать ее надо по другому, но пока не знаю, как.

Для себя недавно заметил, что написание псевдокода на русском языке сильно облегчает решение. Т.е. я вообще тоже обычно пишу на бумаге и считаю этот подход верным, но это обычно выглядит не как алгоритм, а как последовательные рассуждения. А далее, мне помогает написание уже алгоритма, но на русском, типа:
Переменная1=тому-то
Цикл (условие )
и т.д.

Удачи вам ваших творческих поисках!

(Отредактировано автором: 05 Сентября, 2014 - 23:40:37)



-----
Март 2021. Бросил программирование
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB