За последние 24 часа нас посетили 21966 программистов и 1103 робота. Сейчас ищут 663 программиста ...

Нужен скрипт сравнивающий два файла

Тема в разделе "PHP Free-Lance", создана пользователем Namer, 24 мар 2011.

  1. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Здравствуйте.
    Нужен скрипт сравнивающий два файла.
    Файлы имеют строго такой вид:
    файл №1:
    Иванов.А.Б
    Петров.Д.С.
    Антонов.Л.Б
    Бутько.Р.Л
    Шумко.П.Т

    и т.д.

    файл №2:
    Иванова.Н.В
    Петрова.Е.С.
    Антонова.Л.Л
    Бутько.Р.Л
    Шумко.П.Т

    и т.д.

    т.е. это два текстовых файла, в которых ФИО по одному на строчке. ФИО в файлах могут совпадать и идут не по алфавиту.

    Нужен скрипт, который бы делал последовательно следующее:
    1) брал эти два файла, создавал таблицы MySQL с аналогичным файлу названием и загонял каждый в свою таблицу (резервировать нужно около 100 символов на строку, так как иногда файлы будут содержать полные ФИО, типа "Иванов Иван Иванович");
    2) сравнивал эти таблицы ищя совпадения и расхождения.
    Под сравнением имеется ввиду нахождение:
    а) поиск ФИО имеющихся только в 1-ом файле;
    б) поиск ФИО имеющихся только во 2-ом файле;
    в) поиск ФИО совпадающих в обоих файлах.
    3) сохранял на диск эти три файла а.txt б.txt в.txt в алфавитном порядке.
    4) иногда нужно сохранить не три файла, а какой-то один или два, поэтому надо чтобы при запуске скрипт попросил в виде чекбоксов отметить какие файлы сохранять после сравнения.

    p.s. Файлы не маленькие ;)

    Вроде ничего принципиально сложного в задании нет, поэтому бюджет 10$ (300р).
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Возми notepad++ - ни рубля
     
  3. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    У меня есть notepad++ и даже 3, по одному на комп :) Но чем он может помочь? Он же сам скрипт не напишет :)
     
  4. Alessan

    Alessan Активный пользователь

    С нами с:
    29 окт 2008
    Сообщения:
    38
    Симпатии:
    0
    Для меня лично минимум ради которого можно подергаться - 500р. Меньше только для знакомых.
     
  5. Romero

    Romero Активный пользователь

    С нами с:
    1 апр 2010
    Сообщения:
    70
    Симпатии:
    0
    Если 400 руб устроит, пишите в ЛС, завтра сделаю.
     
  6. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Romero, а может за 300? ;) Бюджет он же не резиновый :D
    В качестве компенсации могу дать наводку, вот мой самописный скрипт, который сравнивает эти два файла и сохраняет выборки:
    PHP:
    1. <?php
    2.  
    3. $z1 = fopen ("a.txt", "w+");
    4. $z2 = fopen ("b.txt", "w+");
    5. $z3 = fopen ("c.txt", "w+");
    6.  
    7. $o1 = fopen ("1.txt", "r");
    8. $o2 = fopen ("2.txt", "r");
    9.  
    10. $b1 = fgets($o1);
    11. $b2 = fgets($o2);
    12.  
    13.  
    14. while (!feof($o1) and !feof($o2))   {
    15.     if (strcmp($b1,$b2)<0){
    16.         fwrite ($z1,$b1);//записываем те, что есть только в первом файле
    17.         $b1 = fgets($o1);
    18.     }
    19.     else if (strcmp($b1,$b2)==0){
    20.         fwrite ($z2,$b1);//записываем те, что есть в обоих файлах
    21.         $b1 = fgets($o1); $b2 = fgets($o2);
    22.     }
    23.     else if (strcmp($b1,$b2)>0){
    24.         fwrite ($z3,$b2);//записываем те, что есть только во втором файле
    25.         $b2 = fgets($o2);
    26.     }
    27. }
    28.  
    29. while (!feof($o2))  {//это цикл костыль, чтобы пройти второй файл до конца
    30.     fwrite ($z2,$b2);
    31.     $b2 = fgets($o2);
    32. }
    33.  
    34. fclose($o1);
    35. fclose($o2);
    36. fclose($z1);
    37. fclose($z2);
    38. fclose($z3);
    39.  
    40. ?>
    Но у этого моего скрипта ограничение в том, что файлы должны быть отсортированы. Сейчас же приходят неотсортированные файлы и приходится их для сортировки загонять в базу. Вот и все отличие.
     
  7. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Пока не актуально, человек написал в ЛС и взялся сделать.
     
  8. Romero

    Romero Активный пользователь

    С нами с:
    1 апр 2010
    Сообщения:
    70
    Симпатии:
    0
    В БД загонять только ради сортировки? Сильно.
     
  9. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Romero
    А по другому уже не получается :( Когда файлы были маленькие, можно было его целиком в массив считать и отсортировать. Потом файлы стали расти и перестало хватать памяти на считку файла. Пришлось сортировать с помощь sqlite. А теперь пошли гигабайтные файлы, на которых sqlite давится. Поэтому хочешь ни хочешь, а надо загонять в БД и в ней сортировать.
     
  10. Romero

    Romero Активный пользователь

    С нами с:
    1 апр 2010
    Сообщения:
    70
    Симпатии:
    0
    Гигабайтные текстовые файлы???
     
  11. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Romero, да, не в бирюльки играем ;)
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    в бирюльки как раз. загоняйте в БД

    или загоняй на RAM-диск
     
  13. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Снова актуально.

    Человек который взялся за написание скрипта наткнулся на проблему, что данные из файлов чрезвычайно медленно записываются в БД. У него получилось, что только для загрузки в БД 2-х файлов с размером под 2ГБ, нужно более 50часов! Что естественно странно и никуда не годится.
    Параметры сравниваемых файлов примерно такие:
    - размер файла до 2 ГБ;
    - число строк в файле ~80 млн. шт.

    Я для теста попробовал через консоль mysql закидывать данные в БД. Результат: файл на 373МБ с числом строк 9 230 000 зашел в базу за 10 минут, т.е. со скоростью в десятки раз быстрее чем у его скрипта. Поэтому очевидно что-то не то в его скрипте и он говорит, что как кардинально ускорить процесс не знает и передает эстафету :)

    В общем актуально. Увеличиваю бюджет до 500р. :)
     
  14. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Актуально до сегодняшнего вечера.
    Если никто не берется сделать по нормальному, то сделаю тупо на файлах, разбив большой на 100500 маленьких, отсортировав и сложив по частям. И имел я БД ввиду :)
     
  15. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Namer
    Ты не видишь проблему и за бюджет в 500р. пытаешься найти её решение.
    Загонять файл в БД - это маразм, задача решается самописными индексами по ключу, оперативки желательно побольше, чтобы построить индекс и загнать его для скорости в RAM. Примерно 512 как минимум должно быть.

    Я могу тебе решить эту задачу, но:
    1. На С++
    2. Не за 500р.
     
  16. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Apple, на файлах я и сам на php сделаю.
    Мне надо именно через БД, для общего развития и чтобы сравнить по производительности с вариантом на файлах.
     
  17. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Не сделаешь.
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    $30 и без проблем
     
  19. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Сделаю!
    Могу даже рассказать как это будет.

    1) Создаю в цикле 900 файлов (30*30 букв), по принципу:
    файл аа.txt: Для сточек начинающихся с "аа"
    файл аб.txt: Для сточек начинающихся с "аб"
    файл ав.txt: Для сточек начинающихся с "ав"
    и т.д.

    2) читаю файл построчно и:
    - если он начинается на "аа" записываю в файл аа.txt;
    - если он начинается на "аб" записываю в файл аб.txt;
    - если он начинается на "ав" записываю в файл ав.txt;
    и т.д.
    т.е. пишу сразу в 900 файлов.

    3) сортирую эти полученные маленькие файлы (их размер получится примерно 2000/900=2.3МБ). Такие небольшие файлы я умею сортировать.

    4) собираю из маленьких файлов один отсортированный большой

    5) повторяю эту процедуру для второго файла

    6) сравниваю файлы своим простым но надежным скриптом, что писал выше.

    всё

    Мощно и надежно :)
     
  20. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    дорого :(
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    ты факт, что sqlite гнется, оцени. Это заточеная под работу с текстом система (как и php).
    Чтобы скрипт выполнялся в приемлемые сроки, можно юзать memcached, и вам потребуются гигабайты ОЗУ конечно же, и вообще тут $30 этот минимум.
     
  22. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Не, я этот факт оценить не могу :) Куда и чего он гнется непонятно :)
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    да какая разница, как сказать
     
  24. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Да ничего странного, типичное решение "в лоб", как его и видите вы
    если на выполнение скрипта 200 часов устраивает - то с ходу напишу бесплатно
     
  25. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    [vs], это на больших, а я же, раз не получается через БД, разобью на мелкие (до 10МБ), такие щелкает и не давится :)