Compare files with MATLAB

2019-02-26 21:42发布

问题:

I would like to know how could I compare two files (line by line) (*.xml, .m,.txt,...etc) using MATLAB.

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

I'm looking for a MATLAB function (by command line) that returns me true/false or list of diff.

回答1:

You can use MATLAB's system command with fc if you are in Windows:

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

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

Here status will be 0 if files are equal and 1 if not. Furthermore result will have the diff result if files differ.

For other operating systems you can use similar commands such as cmp in Unix instead of fc.

UPDATE:

For cross-platform compatibility you may try the following:

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)


回答2:

AFAIK the only diffing tool in MATLAB is visdiff which does not return any information, but displays a window with both files side-by-side and highlights the different lines.



回答3:

first change the text file to string, then use strcmp function of matlab.

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


回答4:

First you can read both files by lines:

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);

You will have 2 cell arrays lines1 and lines2. You can compare the whole arrays with

tf = isequal(lines1,lines2);

Comparing lines is not so obvious and depends on your need. What you want to do if number of lines is different? For example, to find which lines from file2 exist in file1 (independently of order) you can do:

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

idx1 will be logical index representing lines in file1 that have the same lines in file2. idx2 will be numeric (position) index of where those lines located in file2 (the first occurrence).

If the number of lines are the same:

idx_same_lines = strcmp(lines1,lines2);


回答5:

In case that you have a file (or a path) with spaces (like c:\my folder\myfile.m), wrap the file name with quotation mark (") in the DOS command. Note that the apostrophe is still needed:

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

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

Alternatively, you can put the quotation mark as soon as you define the variable of the file name:

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

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