2012-02-16 253 views
2

我想知道如何使用MATLAB比較兩個文件(逐行)(* .xml,.m, .txt,...等)。使用MATLAB比較文件

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

我正在尋找一個MATLAB功能(通過命令行)返回我真/假或區分的名單。

回答

5

您可以使用MATLAB的系統命令FC如果你是在Windows中:

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

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

這裏狀態會如果文件相等則爲0,否則爲1。此外結果將有不同的結果,如果文件不同。

對於其他操作系統,您可以在Unix的使用類似的命令,例如CMP代替FC的。

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'進行逐字節比較;你想在Unix上使用'diff'來進行行比較。 – 2012-02-16 22:32:27

+0

@upperBound:它是shell命令嗎?所以它可以在所有操作系統下運行? – lola 2012-02-17 08:08:51

+0

這是一個shell命令。 「fc」是Windows特定的。正如Andrew指出的那樣,Unix使用「diff」。 – upperBound 2012-02-17 15:08:15

1

AFAIK MATLAB中唯一的差異化工具是visdiff,它不返回任何信息,但顯示一個窗口並排顯示兩個文件並突出顯示不同的行。

+0

visdiff是一個圖形化的模式,我尋找一些命令 – lola 2012-02-16 19:54:50

+0

@lola:正如我所說,據我所知,它不存在。你可以編寫自己的程序。 – Jacob 2012-02-16 21:02:21

+0

jacob,使用visdiff,我怎麼能得到文本說文件間有差異? – lola 2012-02-17 11:56:22

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個單元陣列lines1lines2。您可以比較整個陣列與

tf = isequal(lines1,lines2); 

比較線條並不那麼明顯,取決於您的需要。如果行數不同,你想要做什麼?例如,以找到file1中(各自獨立地順序)存在從file2的線可以這樣做:

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

idx1將爲表示file1中具有file2中同一行線邏輯索引。 idx2將是位於file2中的那些行的數字(位置)索引(第一次出現)。

如果行數是相同的:

idx_same_lines = strcmp(lines1,lines2); 
+0

當我使用[idx1 idx2] = ismember(lines1,lines2);我得到一個錯誤:輸入必須是字符串的單元格數組。 – lola 2012-02-17 08:07:06

+0

對不起,我的錯。我用兩條新線更新了代碼。現在'lines1'和'lines2'應該是字符串的單元數組。請再試一次。 – yuk 2012-02-17 08:13:46

+0

感謝yuk,但我想瀏覽file2以檢查'toto []'(可在文件中獲得)也可用於file2 – lola 2012-02-17 09:28:28

1

首先更改文本文件的字符串,然後使用MATLAB的strcmp功能。

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