2016-03-23 15 views
-1

Ben textscan veya textread kullanarak MATLAB içine bir metin dosyasını almak istiyorum.Matlab: Gruplanmış bilgilerle metin dosyası nasıl içe aktarılır?

Benim daha önce ithal metin dosyaları her zaman sıra sıra yazılmış, bu nedenle bu oldukça iyi çalıştı.

ID: 100 Part: 1  
    V1  V2  V3  V4   V5   V6   V7   V8 
X1 33 0.1842831 87 0.9759678 10.07302940 -2.126099 0.9205776 0.9933037  
X2 31 0.1695875 87 0.9961777 18.10119586 -5.153099 0.9651591 0.9999865 

ID: 101 Part: 1 
    V1  V2  V3  V4   V5   V6   V7   V8 
X1 45 0.1942831 87 0.9759678 10.07302940 -2.126099 0.9205776 0.9933037 
X2 52 0.1666875 87 0.9961777 18.10119586 -5.153099 0.9651591 0.9999865 

.... 

Bu yaklaşık 200 kimlikleri ve Bölüm içerir: Şimdi, ithal gereken bir dosya bu şekilde yazılır 1 - Ben oluşturmak istiyorum ne 3.

sonra 2D oluşturan 10 vektörler matris. Her başlık satırından (ID, Part) gelen bilgiler tekrarlı olarak kopyalanmalıdır. Q & Bu değerlerin her alt kümesi için headerlines bilgileri ayıklamak nasıl tespit edemediğim bir here itibaren

ID = [100; 100; 101; 101; ...] 
Part = [1; 1; 1; 1; ...] 
V1 = [33; 31; 45; 52;...] 
V2 = [0.1842831; 0.1695875; 0.1942831; 0.1666875; ...] 
V3 = [....] 
... 

.

Bu nasıl sağlanabilir?

+0

Dosyayı iyi bir şekilde davrandığını varsayarak ve bu formatı izledikten sonra, onu satır-by-line olarak da ayrıştırabilirsiniz. – Amro

cevap

0

Biz dosyası ayrıştırabilir hat-by-line:

% store data here 
ID = []; 
PART = []; 
V = zeros(0,8); 

% loop over lines, each iteration parses one section 
fid = fopen('file.dat', 'rt'); 
while ~feof(fid) 
    % first line is a header with ID/PART 
    tline = fgetl(fid); 
    C = textscan(tline, '%*s %d %*s %d'); 
    ID = [ID; C{1}]; 
    PART = [PART; C{2}]; 

    % second line is another header, ignored 
    tline = fgetl(fid); 

    % next two lines contain samples 
    for i=1:2 
     tline = fgetl(fid); 
     C = textscan(tline, ['%*s' repmat(' %f',1,8)]); 
     V = [V; cell2mat(C)]; 
    end 
end 
fclose(fid); 

% convert to cell array, each cell represents a column: V1, V2, ..., V8 
V = num2cell(V,1); 

bu örnek dosyayı file.dat kullanma: Aşağıdaki sonuçlar elde

ID: 100 Part: 1 
    V1  V2  V3  V4  V5  V6  V7  V8 
X1 33 0.1842831 87 0.9759678 10.07302940 -2.126099 0.9205776 0.9933037 
X2 31 0.1695875 87 0.9961777 18.10119586 -5.153099 0.9651591 0.9999865 
ID: 101 Part: 1 
    V1  V2  V3  V4  V5  V6  V7  V8 
X1 45 0.1942831 87 0.9759678 10.07302940 -2.126099 0.9205776 0.9933037 
X2 52 0.1666875 87 0.9961777 18.10119586 -5.153099 0.9651591 0.9999865 

:

>> ID 
ID = 
     100 
     101 
>> PART 
PART = 
      1 
      1 
>> V 
V = 
    Columns 1 through 6 
    [4x1 double] [4x1 double] [4x1 double] [4x1 double] [4x1 double] [4x1 double] 
    Columns 7 through 8 
    [4x1 double] [4x1 double] 
>> celldisp(V) 
V{1} = 
    33 
    31 
    45 
    52 
..snip.. 
V{8} = 
    0.9933 
    1.0000 
    0.9933 
    1.0000 
0

Eğer senin Dosya büyük, hücre dizileri için bellek ayırmayı düşünürdüm. Satır sayısını bilmiyorsanız, bolca geniş bir dizi ayırın ve ardından tüm boş hücreleri okuduktan sonra kaldırın. Bu koddaki dizilere ayırma dahil edilmedim, ancak bu kolay bir çözüm. Bir şeye ihtiyacın olduğunda haber ver.

fid = fopen('test.txt', 'r'); 
ID = {}; 
Part = {}; 
V = {}; 
line = fgetl(fid); 
while ~isa(line,'double') 
    if ~isempty(line) 
     s = textscan(line,'%s'); 
     s = s{1}; 
     n = length(s); 
     if n ==4 
       ID(length(ID)+1) = s(2); 
       Part(length(Part)+1) = s(4); 
     elseif n == 9 
       V(size(V,1)+1,1:8) = s(2:end); 
     end 
    end 
    line = fgetl(fid); 
end 
fclose(fid); 
İlgili konular