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.
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.
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)
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.
first change the text file to string, then use strcmp function of matlab.
text1 = fileread('test.txt');
text2 = fileread('testcp.txt');
strcmp(text1, text2)
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);
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]);