2013-03-13 826 views
0

真的對這個問題感到沮喪。基本上有一個txt文件,具有代碼行,代碼是字母和數字(不同長度)的混合,不包含逗號和空格,即:txt文件中的一個代碼是X32W21039A23在MATLAB中讀取txt文件(char和數字)到數值數組/矩陣中的最簡單方法?

我需要閱讀它變成了一個數值數組/矩陣,這樣我就很容易操作它,而且我必須用表中相應的數字代替這些字母。這就是我現在有

fid = fopen('upcs.txt'); 
mat = []; 
if fid == -1 
disp('File open was not successful') 
else 
while feof(fid) == 0 
    % Read contents of file and store into a matrix 
    aline = fgetl(fid); 
    [P] = sscanf(aline, '%s'); 
    if length(A) == 12 
     mat = [mat P]; 
    end 
end 
codes =reshape(mat, length(mat)/12, 12) 

基本上我已取出所有的來自不是12個數字長(I可以做到這一點)txt文件線,並轉移剩餘的線成一個字符陣列,「墊子」 。但是,mat是一個字符數組,不是數字數組。我嘗試過這樣的功能,如cell2mat和str2num,但無濟於事,因爲我相信代碼被視爲單元格或字符串,而不是數字。我相信我需要在數組中的字符串之間放置空格。

因此歸結起來,任何人都可以幫我輕鬆地傳輸在TXT文件中的代碼轉換成以這樣的方式,我可以很容易地操作它像數的向量,即:[1 2 3]感謝

+0

我相信你的問題是'的sscanf(艾琳,「%s」的)'。你正在閱讀字符串。只要改成'%d'的'%f',你就會得到P. – 2013-03-13 08:52:57

+0

中的數字我不確定你的意思是「我需要在數組中的字符串之間放置空格」。你的問題究竟是什麼?字符仍然表現爲數字,你仍然可以進行算術或索引操作。 – jazzbassrob 2013-03-13 08:52:57

+0

說一個在txt文件中的代碼是X32W21039A23,我需要用數字-2替換字母。如果我執行上面的腳本,並用命令代碼(1)= -2將-2替換爲-2,我只是得到一個空白的代碼。它看起來像這樣'32W21039A23' – 2013-03-13 13:29:46

回答

0

I」不敢肯定,如果這回答你的問題,但是你可以通過將其轉換爲double強制MATLAB來存儲矩陣數字:

codes = double(codes) 

但是,你仍然可以使用的字符進行算術和索引操作等,所以我不確定這樣做是否做了任何你無法處理的事情。

+0

感謝您的答覆,但如果我做的代碼=雙(代碼),代碼實際上改變,即:074407986439變成48 55 52 52 48 55 57 56 54 52 51 57,但我想保留數字074407986439.我得到的消息「警告:超出範圍或非整數值在轉換爲 字符期間被截斷。」 – 2013-03-13 13:31:42

+0

我真的不明白你在問什麼 - 如果你想轉換數字字符到他們的整數等價物,你可以使用'str2num'。 – jazzbassrob 2013-03-13 13:38:48

+0

是的,這是我想要做的,但是有兩個問題。 (1)數字字符之間沒有空格,但我希望它們不會將字符串'44444'讀到數字44444,但是4 4 4 4 4(2)某些字符串中有一個字母,I需要用數字-1替換,但不知道如何去做 – 2013-03-13 14:13:21

0

我認爲這是你在找什麼:

fid = fopen('upcs.txt'); 
mat = []; 
if fid == -1 
    disp('File open was not successful') 
else 
    while feof(fid) == 0 
     % Read contents of file and store into a matrix 
     aline = fgetl(fid); 
     P = sscanf(aline, '%d'); 
     if length(A) == 12 
      mat = [mat; P]; 
     end 
    end 
end 

codes = mat 

改變sscanf格式%d。也改爲mat追加。這樣mat已經是你的結果。

0

您可以使用從文件中讀取ASCII字符和你想要的值之間的對應關係的表:

table = [zeros(1,'0'-1) , 0:9 , zeros(1,'A'-'9'-1) , ('A':'Z')-'A' + 10]; 
                %// 10 -> 35 
                %// or whatever values for 'A' to 'Z' 

table('ABCDWXYZ') 
%// = [0 1 2 3 4 5 6 7 8 9 10 11 12 13 32 33 34 35] 

table('X32W21039A23') 
%// = [33 3 2 32 2 1 0 3 9 10 2 3] 
相關問題