Сравнить 2 txt файла

Статус
В этой теме нельзя размещать новые ответы.

Юрик

Постоялец
Регистрация
2 Фев 2008
Сообщения
74
Реакции
2
Каким образом можно это сделать?
Пример:
Есть файл 1.txt, 2.txt
В файле 1.txt записи:
Запись1
Запись2
Запись3
Запись4
В файле 2.txt
Запись4
Запись2
Как вывести разницу? т.е.
Запись1
Запись3
 
PHP:
print_r(
	array_diff(
		preg_split('~[\\r\\n]+~',file_get_contents('1.txt'),-1,PREG_SPLIT_NO_EMPTY),
		preg_split('~[\\r\\n]+~',file_get_contents('2.txt'),-1,PREG_SPLIT_NO_EMPTY)
	)
);
 
считывание фала в массив -- file() ( 2 sms-send если для этого регулярки использовать -- жуть, тогда уж explode() )
вывод элементов который содержится только в одном из двух массивов -- array_diff()

вторую функцию вызовешь два раза :
Код:
<?php
$m1=file('1.txt');
$m2=file('2.txt');
$a=array_diff($m1,$m2);
$b=array_diff($m2,$m1);
$result=array_merge($a,$b);
 
считывание фала в массив -- file()

Здесь косяк может быть, если после конечного элемента нет перевода строки либо если используются разные типы переводов (RN, R, N), нужно быть чуть внимательней.
 
file() реагирует на символ конца строки, который у тебя будет в любом случае

Здесь косяк может быть, если после конечного элемента нет перевода строки
а ты проверь =)

если используются разные типы переводов (RN, R, N)
типа перевода всего два -- откуда у тебя третий взялся?
где ты его встречал ?
 
PHP:
<?php
exec(`diff 1file.txt 2file.txt`, $arr);
print_r($arr);
?>
 
file() реагирует на символ конца строки, который у тебя будет в любом случае

Он так же дописывает к строке символ возврата каретки и символ перевода строки, если такие имеются.


Ну проверил ))

PHP:
$m1=file('1.txt');
/*
Запись1
Запись2
Запись3
Запись4 << нет конечного перевода строки
*/

$m2=file('2.txt');

/*
Запись4
Запись2 << нет конечного перевода строки
*/

$a=array_diff($m1,$m2);
$b=array_diff($m2,$m1);
$result=array_merge(
$a,
$b
);
print_r($result);
/*
Выводит:

Array
(
    [0] => Запись1

    [1] => Запись2

    [2] => Запись3

    [3] => Запись4
    [4] => Запись4

    [5] => Запись2
)
*/

типа перевода всего два -- откуда у тебя третий взялся?

0x0D0A - Windows
0x0A - *nix
0x0D - Mac OS
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху