Просмотр полной версии : Скрипт или программа, сравнение 2 файлов
Нужен скрипт или может программа. Задача такая: есть два файла текстовых, необходимо сравнить их и то, чего не хватает в одном из них, вывести в отдельный файл.
Пример:
1-ый файл:
12345
121331
2-ой файл:
11у2323
121331
12345
56738
378арв9
Результат:
11у2323
56738
378арв9
Т.е. если есть одинаковые, но не в таком порядке как в первом файле, выводить не нужно.
Как это реализовать, просто далек от php и всего такого... Спасибо
Deathdreams
27.10.2009, 16:38
$n_one = @file_get_contents('веб путь к файлу #1');
$n_two = @file_get_contents('веб путь к файлу #2');
$n_one = explode("\r\n", $n_one);
$n_two = explode("\r\n", $n_two);
$out = '';
for($i=0; $i <= count($n_one); $i++){
for($y=0; $y <= count($n_two); $y++){
if(trim($n_one[$i]) == trim($n_two[$y])){ continie; }else{
$out .= $n_two[$y].'\r\n';
}
}
echo 'done.\r\nresult:\r\n';
echo $out;
вроде так
Deathdreams c explode() у тебя не выйдет так как "\r\n"
Deathdreams
27.10.2009, 16:50
L I G A
Спс, исправил.
Привык уже одинарные ставить.
<?php
$file1 = file ('18_1.txt');
$file2 = file ('18_2.txt');
$res = array_diff ($file2, $file1);
print_r ($res);
?>
вот и весь код =)
mailbrush
27.10.2009, 16:51
Deathdreams, ну и накодил ты... Цикл в цикле...
Bal-lek, юзай самый простой вариант:
<?php
$file1 = array_map('trim', file('file1.txt'));
$file2 = array_map('trim', file('file2.txt'));
$diffs = array_diff($file2, $file1);
foreach ($diffs as $diff)
echo $diff . "<br>\r\n";
?>
Deathdreams
27.10.2009, 16:52
mailbrush
То, что первым в голову пришло : )
Gray_Wolf
27.10.2009, 18:23
mailbrush
То, что первым в голову пришло : )
Ну пузырёк вообще часто первым приходит в голову, но лучше от этого отвыкать...
Pashkela
27.10.2009, 18:40
А теперь представьте себе, что оперативки ~ 64 мб и у вас оба файла по 1Гб. Напишите универсальное решение, самим интересно будет :)
ВСЕМ спасибо, ребят, сорри но я вообще нуб в php, как мне теперь организовать вывод результата либо на экран либо в файл?
ВСЕМ спасибо, ребят, сорри но я вообще нуб в php, как мне теперь организовать вывод результата либо на экран либо в файл?
в коде: mailbrush'a , krypt3r 'a & Deathdreams'a присутствует вывод
просто у меня ничего из этого не работает, названия файлов указал свои ес-но, денвер стоит :)
используя код krypt3r выводит на экран
Array ( [2] => 2 )
при использовании кода mailbrush пустой экран и ничего нету в папке
Спасибо за ответы :)
mailbrush
27.10.2009, 21:01
А теперь представьте себе, что оперативки ~ 64 мб и у вас оба файла по 1Гб. Напишите универсальное решение, самим интересно будет :)
Как вариант - считывать по одной строке fgets.
просто у меня ничего из этого не работает, названия файлов указал свои ес-но
Надеюсь, ты не открываешь скрипт в браузере? Всмысле напряму, с компа. Сервер юзаешь?
Надеюсь, ты не открываешь скрипт в браузере? Всмысле напряму, с компа. Сервер юзаешь?
ну закинул папку в www на денвере, а вот насчет браузера не понял, я через браузер запускаю скрипты которые есть у меня...
Сервер юзаешь?
юзает:Array ( [2] => 2 )
Bal-lek
в файлах есть что то?
да, в первом
1
2
3
во втором
3
2
4
1
ясен пень что ничего небудет а где функция открытия файлов fopen() и закрытия после записи в него?- fclose() тебе не готовую программу дали а направление в котором ее до ума довести
P.S. Прошу прощение- просто не посмотрел внимательно код- думал результат в файл сохраняеться
Kusto а зачем так нервничать, я никого не заставляю отвечать, и зачем писать сюда ясен пень что ничего небудет а где функция открытия файлов fopen() и закрытия после записи в него?- fclose() тебе не готовую программу дали а направление в котором ее до ума довести
если я написал в начале темы
Как это реализовать, просто далек от php и всего такого... Спасибо
Вы думаете я знаю что это нужно сделать?
Кто не хочет не отвечайте, никого ен заставляю!!!
Kusto а зачем так нервничать, я никого не заставляю отвечать, и зачем писать сюда
если я написал в начале темы
Вы думаете я знаю что это нужно сделать?
Кто не хочет не отвечайте, никого ен заставляю!!!
абсолютно без нервов))) просто говорю что сырая программа и не к те относилось)))
ясен пень что ничего небудет а где функция открытия файлов fopen() и закрытия после записи в него?- fclose() тебе не готовую программу дали а направление в котором ее до ума довести
Кусто не объязательно юзать fopen() ,следственно и fclose(),ему дали готовый код.
Kusto понятно :) сижу тут разглядываю php команды :) писец, у меня направление прямо параллельное :) в php как свинья в апельсинах :)
все работает результат вывода:
11у2323
56738
378арв9
я так думаю что ты просто файлы текстовые не так обозвал- создай их два один назови file1 второй соответственно file2 и их в ту-же дирректорию на денвере закинь
спасибо понял ошибку свою(обозвал правильно, просто указывал у себя в каждой строке по 1 цифре, из-за этого я так понял косяк был), но !!!!!!!!!
т.к. 12345 стоит и там и там, о у меня эта строка тоже выводится... а мне не нуна выводить 12345 :)
Спасибо тем, кто откликается ребята.
Pashkela
28.10.2009, 07:12
Как вариант - считывать по одной строке fgets.
Неправильный ответ :) Каков буфер для считывания строки? Длина строки может быть и больше 1024 байта. Как определить правильный буфер - чтобы не больше, не меньше и не вылезти за пределы оперативки? Зададите с запасом 10 кб - а строчка будет ХОТЬ одна 11 кб - и все, пролёт. А если весь файл равный 1 Гб состоит из одной строки? Думайте дальше, не все так просто, как кажется.
Еще раз условия:
1. Оперативка = 64 мб
2. Есть два файла, оба по 1Гб
3. Длина максимальной строки в каждом из файлов просто напросто неизвестна. Допускается, что каждый файл может состоять из одной строки, а может и из нескольких.
4. Цель - сравнить оба файла на идентичность текста
Вот если вы до сих пор думаете, что это очень просто - не вопрос, скрипт в студию. Универсальный скрипт, на все случаи жизни, при любых объемах оперативки и самих файлов.
PS: А то что не вопрос такого рода, так сразу массивы пишут свои. Фигушки
Кстати, можно еще так реализовать
Есть два файла 1.txt, 2.txt
формата
111:
222
3333с
Надо удалить слова из файла 2.txt если они есть в файле 1.txt
мне главное чтобы оставались только уникальные строки, даже если порядок строк разный, т.е. я так понимаю необходимо сравнение каждой строки одного файла с каждой строкой другого и если строка одинаковая - удалить её из файла 2.txt
сравнения файлов на различия в linux можно провести командой diff
Deathdreams
28.10.2009, 15:27
Pashkela
Как вариант, сравнивать md5 строк.
я прав?
Или вопрос в другом заключается
mailbrush
28.10.2009, 15:34
Pashkela
Как вариант, сравнивать md5 строк.
я прав?
Или вопрос в другом заключается
Ты не прав, ибо:
1. Надо вывести уникальные строки, а как ты с помощью md5 выведешь уникальные?
2. Чтоьы md5 файла узнать, надо открыть его и считать данные, в чем и состоит вопрос.
Pashkela, ну тогда по одному символу =\
Ребят, это конечно хорошо что вы мне тему апаете :) мне бы скриптик... :rolleyes:
Pashkela
28.10.2009, 21:27
Pashkela, ну тогда по одному символу =\
Без диапазона? Просто от начала и до конца файла? Файл 1 Гб, сам прикинь, сколько такой скрипт работать будет. Даже с потоками
Deathdreams
28.10.2009, 22:28
Не знаю, был ли вариант, fgets'ом считывать файл.
Хотя мы не знаем какого размера строка...ы
Pashkela
28.10.2009, 23:09
Ну для начала узнать длину строки, наверное :) А еще раньше просто понять, что такое строка. А вообще вариантов может быть миллион наверное. Главное чтобы работало
Deathdreams, krypt3r вы сейчас со мной разговариваете? :):):):):)
Если насчет строки мне вопрос был, то скажу что в каждой строке примерно по 40 символов +- 10
Deathdreams, krypt3r вы сейчас со мной разговариваете? :):):):):)
Если насчет строки мне вопрос был, то скажу что в каждой строке примерно по 40 символов +- 10
Тебе дали полностью рабочий скрипт- ты видел я выложил результат без всяких 12345 (я даже непредставляю что за глюк у тедя на денвере)
Ну ябы сделал на говнокоде так:
Открываем файл,читаем до первого "\r\n" или аналога(не суть важно),далее счетаем количество символов в строке,переводем в байты,считываем строку,сравниваем с аналогом во 2 докуменнте.В общем мы теряемслишком дохера времени.Проше установить линукс и заюзать дифф
капец, вроде с файликами после переустановки все нормально сработало, теперь закинул в один файл 2000 строк во второй 1000 - выводит только 2 строчки и все, в чем м.б. проблема? Может в денвере косяк какой? но вроде качал нормальный, по ссылке с мейла пришедшей после запроса на скачку
капец, вроде с файликами после переустановки все нормально сработало, теперь закинул в один файл 2000 строк во второй 1000 - выводит только 2 строчки и все, в чем м.б. проблема? Может в денвере косяк какой? но вроде качал нормальный, по ссылке с мейла пришедшей после запроса на скачку
А ты думал что все будет так легко? Советую всеже поставить Юних,и сравнить дифф-ом %)
Или же писать это дело на компиле,ибо на php писать такие тулзы это зло :(
mailbrush
29.10.2009, 00:16
Bal-lek, стукни 674542, обсудим :) накодю на С++
капец, вроде с файликами после переустановки все нормально сработало, теперь закинул в один файл 2000 строк во второй 1000 - выводит только 2 строчки и все, в чем м.б. проблема? Может в денвере косяк какой? но вроде качал нормальный, по ссылке с мейла пришедшей после запроса на скачку
проблемма в том что пока скрипт необработает ПОЛНОСТЬЮ оба файла- он невыведет тебе ничего на экран- (такая вот зараза пых) просто будет показывать что страница грузиться- для этого надо просто время и терпение
Ребята, всем спасибо, нашел програмку которая полностью удовлетворяет требованиям, называется Ultra Compare Professional.
sedoy_xxx
03.11.2009, 22:35
пестец )))) diff в линухе и COMP в вензозе ))))
sedoy_xxx представьте себе...
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot