2012-02-16 4 views
2

Я хотел бы знать, как можно сравнить два файла (строка за строкой) (* .xml, .m, .txt, ... и т. Д.) С использованием MATLAB.Сравнение файлов с MATLAB

file1 = 'toto.xml'; 
file2 = 'titi.xml'; 

Я ищу функцию MATLAB (по командной строке), которая возвращает меня истина/ложь или список дифф.

ответ

5

Вы можете использовать системы команды MATLAB с ФХ, если вы находитесь в Windows:

file_name_1 = 'file1.txt'; 
file_name_2 = 'file2.txt'; 

[status,result] = system(['fc ' file_name_1 ' ' file_name_2]); 

Здесь статус будет 0, если файлы равны, а 1 - нет. Кроме того, результат будет иметь результат diff, если файлы отличаются.

Для других операционных систем вы можете использовать подобные команды, такие как КСС в Unix вместо ФХ.

UPDATE:

Для кросс-платформенной совместимости, вы можете попробовать следующее:

file_1 = javaObject('java.io.File', 'file1.txt'); 
file_2 = javaObject('java.io.File', 'file2.txt'); 
is_equal = javaMethod('contentEquals','org.apache.commons.io.FileUtils',... 
         file_1, file_2) 
+0

+1. 'cmp' выполняет побайтовое сравнение; вы хотите 'diff' в Unix для сравнения по линиям. –

+0

@upperBound: это команда оболочки? поэтому он может работать под любой ОС? – lola

+0

Это командная оболочка. «fc» относится к Windows. Для Unix используйте «diff», как указал Андрей. – upperBound

1

AFAIK единственный отличительный инструмент в MATLAB - visdiff, который не возвращает никакой информации, но отображает окно с обоими файлами бок о бок и выделяет разные строки.

+0

visdiff является графической моделью, я ищу некоторые команды – lola

+0

@lola: И, как я сказал, насколько я знаю, его не существует. Однако вы могли бы написать свою собственную программу. – Jacob

+0

jacob, используя visdiff, как я могу получить текст, говорящий, что существует разница между файлами? – lola

0

Сначала вы можете прочитать оба файла по строкам:

fid1 = fopen(file1, 'r'); 
fid2 = fopen(file2, 'r'); 

lines1 = textscan(fid1,'%s','delimiter','\n'); 
lines2 = textscan(fid2,'%s','delimiter','\n'); 
lines1 = lines1{1}; 
lines2 = lines2{1}; 


fclose(fid1); 
fclose(fid2); 

Вы будете иметь 2 клеточные массивы lines1 и lines2. Вы можете сравнить все массивы с

tf = isequal(lines1,lines2); 

Сравнение строк не так очевидно и зависит от ваших потребностей. Что вы хотите сделать, если количество строк отличается? Например, чтобы выяснить, какие существуют строки из file2 в file1 (независимо от того), вы можете сделать:

[idx1 idx2] = ismember(lines1,lines2); 
idx2(idx2==0) = []; 

idx1 будет логический индекс, представляющий линии в file1, которые имеют одни и те же строки в file2. idx2 будет числовым (позиционным) индексом, где эти строки находятся в файле2 (первое вхождение).

Если число строк одинаковы:

idx_same_lines = strcmp(lines1,lines2); 
+0

, когда я использую [idx1 idx2] = ismember (lines1, lines2); Я получил ошибку: Ввод должен быть массивом ячеек строк. – lola

+0

Извините, моя ошибка. Я обновил код двумя новыми строками. Теперь 'lines1' и' lines2' должны быть массивами ячеек строк. Пожалуйста, попробуйте еще раз. – yuk

+0

спасибо yuk, но я хотел бы просмотреть файл2, чтобы проверить, что 'toto []' (который доступен в файле) также доступен в файле2 – lola

1

первое изменение текстового файла в строку, а затем использовать зЬгстр функцию MATLAB.

text1 = fileread('test.txt'); 
text2 = fileread('testcp.txt'); 
strcmp(text1, text2) 
0

В случае, если у вас есть файл (или путь) с пробелами (как C: \ моя папка \ myfile.m), оберните имя файла с кавычки (") в команде DOS ,Обратите внимание, что апостроф по-прежнему необходим:

file_name_1 = 'file 1.txt'; 
file_name_2 = 'file 2.txt'; 

[status,result] = system(['fc ', '"', file_name_1, '" "', file_name_2, '"']); 

В качестве альтернативы, вы можете поставить кавычку как только вы определяете переменные с именем файла:

file_name_1 = '"file 1.txt"'; 
file_name_2 = '"file 2.txt"'; 

[status,result] = system(['fc ' file_name_1 ' ' file_name_2]); 
Смежные вопросы