2015-05-09 57 views
1

我想訂購.txt文件看起來像這樣的命令(使用具體方法).txt文件:如何利用Matlab

G1-G2-H2-I2 
E1-E2-E3 
D5-E5-F5 
F8-F7 
J4-K4 
D8-D9 
B9 
H4 
L13 
C12 
FIN 

我想獲得的順序是A1 > A2> B2 ...等,所以我試圖按字母順序排列,如果它們具有相同的字母,那麼我希望它們按數字順序排列。在這個例子中我張貼你可以看到一切正常有序的,而不是包含線路:

F8-F7 

當它應該是:

F7-F8 

我想提供更多的rearrengements另一個例子做如果.txt文件的第一行是:

H2-G2-I2-G1 

應改爲:

G1-G2-H2-I2 

完成所有這些更改後,我想創建一個包含正確順序並遵循相同結構的新.txt文件。

所以,我設法通過將它們轉換爲數字(使用ASCII)來排序只包含兩對的行,但我確實被困在如何排序其他行。

的.txt文件將始終具有相同的結構,這意味着:

第一線→4雙 第二線→3雙 第三線→3雙 第4行→2雙 第五行→ 2雙 6號線→2雙 七號線→1對 8號線→1對 9號線→1對 10號線→1對 11號線→總是包含「FIN」字符串

我試圖用Matlab來做到這一點,我已經安裝了最新版本。

非常感謝您的幫助,我非常感謝。

回答

0

排序可以使用sort輕鬆完成,下面的代碼讀取輸入文件,排序每一行,並將其寫入到輸出文件:

function [] = sort_file(input_file_name, output_file_name) 

input = fopen(input_file_name, 'r'); 
output = fopen(output_file_name, 'w'); 

delimiter = '-'; 
for k=1:10 
    line = fgetl(input); 
    split_line = strsplit(line,delimiter); 
    % add leading zeros to ensure correct sorting 
    split_line = regexprep(split_line, '^([A-Z])([0-9])$', '$10$2'); 
    sorted_line = sort(split_line); 
    % remove leading zeros before writing the output 
    sorted_line = regexprep(sorted_line, '^([A-Z])0([1-9])$', '$1$2'); 
    fprintf(output, '%s\n', strjoin(sorted_line,delimiter)); 
end 

fwrite(output, 'FIN'); 

fclose(input); 
fclose(output); 

end 
+0

感謝您的快速反應,但如果我把這個J9-K9-K10-L10這是不行的,它以這種方式訂購:J9-K10-K9-L10但它應該是:J9-K9-K10-L10 – LunarParks

+0

@LunarParks:我更新了我的答案,它現在也適用於這些情況 –

0

你可能想使用the natsort toolbox那不正是你想。

從它的文檔:

A = {'a2', 'a', 'a10', 'a1'}; 
sort(A) 
ans = {'a', 'a1', 'a10', 'a2'} 
natsort(A) 
ans = {'a', 'a1', 'a2', 'a10'} 

在您的例子:

>> natsort(strsplit('J9-K9-K10-L10', '-')) 

ans = 

'J9' 'K9' 'K10' 'L10' 

>>