Здравствуйте. Нужен скрипт сравнивающий два файла. Файлы имеют строго такой вид: файл №1: Иванов.А.Б Петров.Д.С. Антонов.Л.Б Бутько.Р.Л Шумко.П.Т и т.д. файл №2: Иванова.Н.В Петрова.Е.С. Антонова.Л.Л Бутько.Р.Л Шумко.П.Т и т.д. т.е. это два текстовых файла, в которых ФИО по одному на строчке. ФИО в файлах могут совпадать и идут не по алфавиту. Нужен скрипт, который бы делал последовательно следующее: 1) брал эти два файла, создавал таблицы MySQL с аналогичным файлу названием и загонял каждый в свою таблицу (резервировать нужно около 100 символов на строку, так как иногда файлы будут содержать полные ФИО, типа "Иванов Иван Иванович"); 2) сравнивал эти таблицы ищя совпадения и расхождения. Под сравнением имеется ввиду нахождение: а) поиск ФИО имеющихся только в 1-ом файле; б) поиск ФИО имеющихся только во 2-ом файле; в) поиск ФИО совпадающих в обоих файлах. 3) сохранял на диск эти три файла а.txt б.txt в.txt в алфавитном порядке. 4) иногда нужно сохранить не три файла, а какой-то один или два, поэтому надо чтобы при запуске скрипт попросил в виде чекбоксов отметить какие файлы сохранять после сравнения. p.s. Файлы не маленькие Вроде ничего принципиально сложного в задании нет, поэтому бюджет 10$ (300р).
У меня есть notepad++ и даже 3, по одному на комп Но чем он может помочь? Он же сам скрипт не напишет
Romero, а может за 300? Бюджет он же не резиновый В качестве компенсации могу дать наводку, вот мой самописный скрипт, который сравнивает эти два файла и сохраняет выборки: PHP: <?php set_time_limit(0); $z1 = fopen ("a.txt", "w+"); $z2 = fopen ("b.txt", "w+"); $z3 = fopen ("c.txt", "w+"); $o1 = fopen ("1.txt", "r"); $o2 = fopen ("2.txt", "r"); $b1 = fgets($o1); $b2 = fgets($o2); while (!feof($o1) and !feof($o2)) { if (strcmp($b1,$b2)<0){ fwrite ($z1,$b1);//записываем те, что есть только в первом файле $b1 = fgets($o1); } else if (strcmp($b1,$b2)==0){ fwrite ($z2,$b1);//записываем те, что есть в обоих файлах $b1 = fgets($o1); $b2 = fgets($o2); } else if (strcmp($b1,$b2)>0){ fwrite ($z3,$b2);//записываем те, что есть только во втором файле $b2 = fgets($o2); } } while (!feof($o2)) {//это цикл костыль, чтобы пройти второй файл до конца fwrite ($z2,$b2); $b2 = fgets($o2); } fclose($o1); fclose($o2); fclose($z1); fclose($z2); fclose($z3); ?> Но у этого моего скрипта ограничение в том, что файлы должны быть отсортированы. Сейчас же приходят неотсортированные файлы и приходится их для сортировки загонять в базу. Вот и все отличие.
Romero А по другому уже не получается Когда файлы были маленькие, можно было его целиком в массив считать и отсортировать. Потом файлы стали расти и перестало хватать памяти на считку файла. Пришлось сортировать с помощь sqlite. А теперь пошли гигабайтные файлы, на которых sqlite давится. Поэтому хочешь ни хочешь, а надо загонять в БД и в ней сортировать.
Снова актуально. Человек который взялся за написание скрипта наткнулся на проблему, что данные из файлов чрезвычайно медленно записываются в БД. У него получилось, что только для загрузки в БД 2-х файлов с размером под 2ГБ, нужно более 50часов! Что естественно странно и никуда не годится. Параметры сравниваемых файлов примерно такие: - размер файла до 2 ГБ; - число строк в файле ~80 млн. шт. Я для теста попробовал через консоль mysql закидывать данные в БД. Результат: файл на 373МБ с числом строк 9 230 000 зашел в базу за 10 минут, т.е. со скоростью в десятки раз быстрее чем у его скрипта. Поэтому очевидно что-то не то в его скрипте и он говорит, что как кардинально ускорить процесс не знает и передает эстафету В общем актуально. Увеличиваю бюджет до 500р.
Актуально до сегодняшнего вечера. Если никто не берется сделать по нормальному, то сделаю тупо на файлах, разбив большой на 100500 маленьких, отсортировав и сложив по частям. И имел я БД ввиду
Namer Ты не видишь проблему и за бюджет в 500р. пытаешься найти её решение. Загонять файл в БД - это маразм, задача решается самописными индексами по ключу, оперативки желательно побольше, чтобы построить индекс и загнать его для скорости в RAM. Примерно 512 как минимум должно быть. Я могу тебе решить эту задачу, но: 1. На С++ 2. Не за 500р.
Apple, на файлах я и сам на php сделаю. Мне надо именно через БД, для общего развития и чтобы сравнить по производительности с вариантом на файлах.
Сделаю! Могу даже рассказать как это будет. 1) Создаю в цикле 900 файлов (30*30 букв), по принципу: файл аа.txt: Для сточек начинающихся с "аа" файл аб.txt: Для сточек начинающихся с "аб" файл ав.txt: Для сточек начинающихся с "ав" и т.д. 2) читаю файл построчно и: - если он начинается на "аа" записываю в файл аа.txt; - если он начинается на "аб" записываю в файл аб.txt; - если он начинается на "ав" записываю в файл ав.txt; и т.д. т.е. пишу сразу в 900 файлов. 3) сортирую эти полученные маленькие файлы (их размер получится примерно 2000/900=2.3МБ). Такие небольшие файлы я умею сортировать. 4) собираю из маленьких файлов один отсортированный большой 5) повторяю эту процедуру для второго файла 6) сравниваю файлы своим простым но надежным скриптом, что писал выше. всё Мощно и надежно
ты факт, что sqlite гнется, оцени. Это заточеная под работу с текстом система (как и php). Чтобы скрипт выполнялся в приемлемые сроки, можно юзать memcached, и вам потребуются гигабайты ОЗУ конечно же, и вообще тут $30 этот минимум.
Да ничего странного, типичное решение "в лоб", как его и видите вы если на выполнение скрипта 200 часов устраивает - то с ходу напишу бесплатно
[vs], это на больших, а я же, раз не получается через БД, разобью на мелкие (до 10МБ), такие щелкает и не давится