Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Скрипт или программа, сравнение 2 файлов (https://forum.antichat.xyz/showthread.php?t=151540)

Bal-lek 27.10.2009 15:21

Скрипт или программа, сравнение 2 файлов
 
Нужен скрипт или может программа. Задача такая: есть два файла текстовых, необходимо сравнить их и то, чего не хватает в одном из них, вывести в отдельный файл.
Пример:
1-ый файл:
12345
121331

2-ой файл:
11у2323
121331
12345
56738
378арв9

Результат:
11у2323
56738
378арв9


Т.е. если есть одинаковые, но не в таком порядке как в первом файле, выводить не нужно.
Как это реализовать, просто далек от php и всего такого... Спасибо

Deathdreams 27.10.2009 16:38

PHP код:


$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

вроде так

L I G A 27.10.2009 16:50

Deathdreams c explode() у тебя не выйдет так как "\r\n"

Deathdreams 27.10.2009 16:50

L I G A
Спс, исправил.

Привык уже одинарные ставить.

krypt3r 27.10.2009 16:51

PHP код:

<?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 код:

<?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

Цитата:

Сообщение от Deathdreams
mailbrush
То, что первым в голову пришло : )

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

Pashkela 27.10.2009 18:40

А теперь представьте себе, что оперативки ~ 64 мб и у вас оба файла по 1Гб. Напишите универсальное решение, самим интересно будет :)

Bal-lek 27.10.2009 20:36

ВСЕМ спасибо, ребят, сорри но я вообще нуб в php, как мне теперь организовать вывод результата либо на экран либо в файл?

L I G A 27.10.2009 20:50

Цитата:

Сообщение от Bal-lek
ВСЕМ спасибо, ребят, сорри но я вообще нуб в php, как мне теперь организовать вывод результата либо на экран либо в файл?

в коде: mailbrush'a , krypt3r 'a & Deathdreams'a присутствует вывод

Bal-lek 27.10.2009 20:57

просто у меня ничего из этого не работает, названия файлов указал свои ес-но, денвер стоит :)
используя код krypt3r выводит на экран
Array ( [2] => 2 )

при использовании кода mailbrush пустой экран и ничего нету в папке
Спасибо за ответы :)

mailbrush 27.10.2009 21:01

Цитата:

Сообщение от Pashkela
А теперь представьте себе, что оперативки ~ 64 мб и у вас оба файла по 1Гб. Напишите универсальное решение, самим интересно будет :)

Как вариант - считывать по одной строке fgets.
Цитата:

Сообщение от Bal-lek
просто у меня ничего из этого не работает, названия файлов указал свои ес-но

Надеюсь, ты не открываешь скрипт в браузере? Всмысле напряму, с компа. Сервер юзаешь?

Bal-lek 27.10.2009 21:04

Цитата:

Надеюсь, ты не открываешь скрипт в браузере? Всмысле напряму, с компа. Сервер юзаешь?
ну закинул папку в www на денвере, а вот насчет браузера не понял, я через браузер запускаю скрипты которые есть у меня...

L I G A 27.10.2009 21:04

Цитата:

Сервер юзаешь?
юзает:Array ( [2] => 2 )

Bal-lek
в файлах есть что то?

Bal-lek 27.10.2009 21:10

да, в первом
1
2
3
во втором
3
2
4
1

Kusto 27.10.2009 21:14

ясен пень что ничего небудет а где функция открытия файлов fopen() и закрытия после записи в него?- fclose() тебе не готовую программу дали а направление в котором ее до ума довести
P.S. Прошу прощение- просто не посмотрел внимательно код- думал результат в файл сохраняеться

Bal-lek 27.10.2009 21:21

Kusto а зачем так нервничать, я никого не заставляю отвечать, и зачем писать сюда
Цитата:

ясен пень что ничего небудет а где функция открытия файлов fopen() и закрытия после записи в него?- fclose() тебе не готовую программу дали а направление в котором ее до ума довести
если я написал в начале темы
Цитата:

Как это реализовать, просто далек от php и всего такого... Спасибо
Вы думаете я знаю что это нужно сделать?
Кто не хочет не отвечайте, никого ен заставляю!!!

Kusto 27.10.2009 21:22

Цитата:

Сообщение от Bal-lek
Kusto а зачем так нервничать, я никого не заставляю отвечать, и зачем писать сюда
если я написал в начале темы

Вы думаете я знаю что это нужно сделать?
Кто не хочет не отвечайте, никого ен заставляю!!!

абсолютно без нервов))) просто говорю что сырая программа и не к те относилось)))

L I G A 27.10.2009 21:29

Цитата:

Сообщение от Kusto
ясен пень что ничего небудет а где функция открытия файлов fopen() и закрытия после записи в него?- fclose() тебе не готовую программу дали а направление в котором ее до ума довести

Кусто не объязательно юзать fopen() ,следственно и fclose(),ему дали готовый код.

Bal-lek 27.10.2009 21:30

Kusto понятно :) сижу тут разглядываю php команды :) писец, у меня направление прямо параллельное :) в php как свинья в апельсинах :)

Kusto 27.10.2009 21:41

все работает результат вывода:

11у2323
56738
378арв9


я так думаю что ты просто файлы текстовые не так обозвал- создай их два один назови file1 второй соответственно file2 и их в ту-же дирректорию на денвере закинь

Bal-lek 27.10.2009 21:56

спасибо понял ошибку свою(обозвал правильно, просто указывал у себя в каждой строке по 1 цифре, из-за этого я так понял косяк был), но !!!!!!!!!
т.к. 12345 стоит и там и там, о у меня эта строка тоже выводится... а мне не нуна выводить 12345 :)
Спасибо тем, кто откликается ребята.

Pashkela 28.10.2009 07:12

Цитата:

Сообщение от mailbrush
Как вариант - считывать по одной строке fgets.

Неправильный ответ :) Каков буфер для считывания строки? Длина строки может быть и больше 1024 байта. Как определить правильный буфер - чтобы не больше, не меньше и не вылезти за пределы оперативки? Зададите с запасом 10 кб - а строчка будет ХОТЬ одна 11 кб - и все, пролёт. А если весь файл равный 1 Гб состоит из одной строки? Думайте дальше, не все так просто, как кажется.

Еще раз условия:

1. Оперативка = 64 мб
2. Есть два файла, оба по 1Гб
3. Длина максимальной строки в каждом из файлов просто напросто неизвестна. Допускается, что каждый файл может состоять из одной строки, а может и из нескольких.
4. Цель - сравнить оба файла на идентичность текста

Вот если вы до сих пор думаете, что это очень просто - не вопрос, скрипт в студию. Универсальный скрипт, на все случаи жизни, при любых объемах оперативки и самих файлов.

PS: А то что не вопрос такого рода, так сразу массивы пишут свои. Фигушки

Bal-lek 28.10.2009 09:25

Кстати, можно еще так реализовать
Есть два файла 1.txt, 2.txt
формата
111:
222
3333с
Надо удалить слова из файла 2.txt если они есть в файле 1.txt
мне главное чтобы оставались только уникальные строки, даже если порядок строк разный, т.е. я так понимаю необходимо сравнение каждой строки одного файла с каждой строкой другого и если строка одинаковая - удалить её из файла 2.txt

demond 28.10.2009 10:35

сравнения файлов на различия в linux можно провести командой diff

Bal-lek 28.10.2009 11:45

у меня не стоит линукс

Deathdreams 28.10.2009 15:27

Pashkela
Как вариант, сравнивать md5 строк.

я прав?
Или вопрос в другом заключается

mailbrush 28.10.2009 15:34

Цитата:

Сообщение от Deathdreams
Pashkela
Как вариант, сравнивать md5 строк.

я прав?
Или вопрос в другом заключается

Ты не прав, ибо:
1. Надо вывести уникальные строки, а как ты с помощью md5 выведешь уникальные?
2. Чтоьы md5 файла узнать, надо открыть его и считать данные, в чем и состоит вопрос.

Pashkela, ну тогда по одному символу =\

Bal-lek 28.10.2009 18:32

Ребят, это конечно хорошо что вы мне тему апаете :) мне бы скриптик... :rolleyes:

Pashkela 28.10.2009 21:27

Цитата:

Pashkela, ну тогда по одному символу =\
Без диапазона? Просто от начала и до конца файла? Файл 1 Гб, сам прикинь, сколько такой скрипт работать будет. Даже с потоками

Deathdreams 28.10.2009 22:28

Не знаю, был ли вариант, fgets'ом считывать файл.

Хотя мы не знаем какого размера строка...ы

krypt3r 28.10.2009 22:51

Заюзать мапирование? )

Pashkela 28.10.2009 23:09

Ну для начала узнать длину строки, наверное :) А еще раньше просто понять, что такое строка. А вообще вариантов может быть миллион наверное. Главное чтобы работало

Bal-lek 28.10.2009 23:10

Deathdreams, krypt3r вы сейчас со мной разговариваете? :):):):):)
Если насчет строки мне вопрос был, то скажу что в каждой строке примерно по 40 символов +- 10

Kusto 28.10.2009 23:16

Цитата:

Сообщение от Bal-lek
Deathdreams, krypt3r вы сейчас со мной разговариваете? :):):):):)
Если насчет строки мне вопрос был, то скажу что в каждой строке примерно по 40 символов +- 10

Тебе дали полностью рабочий скрипт- ты видел я выложил результат без всяких 12345 (я даже непредставляю что за глюк у тедя на денвере)

m0Hze 28.10.2009 23:45

Ну ябы сделал на говнокоде так:
Открываем файл,читаем до первого "\r\n" или аналога(не суть важно),далее счетаем количество символов в строке,переводем в байты,считываем строку,сравниваем с аналогом во 2 докуменнте.В общем мы теряемслишком дохера времени.Проше установить линукс и заюзать дифф

Bal-lek 28.10.2009 23:45

капец, вроде с файликами после переустановки все нормально сработало, теперь закинул в один файл 2000 строк во второй 1000 - выводит только 2 строчки и все, в чем м.б. проблема? Может в денвере косяк какой? но вроде качал нормальный, по ссылке с мейла пришедшей после запроса на скачку

m0Hze 29.10.2009 00:07

Цитата:

Сообщение от Bal-lek
капец, вроде с файликами после переустановки все нормально сработало, теперь закинул в один файл 2000 строк во второй 1000 - выводит только 2 строчки и все, в чем м.б. проблема? Может в денвере косяк какой? но вроде качал нормальный, по ссылке с мейла пришедшей после запроса на скачку

А ты думал что все будет так легко? Советую всеже поставить Юних,и сравнить дифф-ом %)
Или же писать это дело на компиле,ибо на php писать такие тулзы это зло :(

mailbrush 29.10.2009 00:16

Bal-lek, стукни 674542, обсудим :) накодю на С++


Время: 22:21