2017-05-08 3 views
0

Ich habe 30 TXT-Dateien mit dem gleichen Format wie unten gezeigt. Von jeder Datei muss ich den entsprechenden Wert und die Matrix extrahieren, daher muss ich die Zeichenkette überspringen und auch die Leerzeile. Ich kenne auch die Gesamtzählzahl für jede n-mal-n-Matrix für jeden Zeitschritt (in diesem Fall haben wir eine 5 × 5-Matrix). Mein Code funktioniert jedoch nicht. HierMatlab: Txt-Datei mit mehreren Format lesen und die Zeichenfolge und die Leerzeile überspringen

ist der Inhalt der txt-Datei

Current Time Step =   2 

Array - one 

      1   2   3   4   5 
      2   0   1   0   0 
      3   1   0   0   0 
      4   0   0   0   1 
      5   0   0   1   0 

Array - two 

      1   1   1   1   1 
      2   0   1   0   0 
      3   1   0   0   0 
      4   0   0   0   1 
      5   0   0   1   0 

Array - three 

      1 0.000000000000000E+000 0.000000000000000E+000 
      2 -2.43840000000000  0.000000000000000E+000 
      3 2.43840000000000  0.000000000000000E+000 
      4 0.000000000000000E+000 -2.43840000000000  
      5 0.000000000000000E+000 2.43840000000000  

Array - four 

      1 8.969565865552799E-004 
      2 3.871274684514957E-004 
      3 3.871274684514958E-004 
      4 3.871274684514958E-004 
      5 3.871274684514956E-004 

Array - five 

      1 35472082.4364420  
      2 34502005.6533170  
      3 34502005.6533170  
      4 34502005.6533170  
      5 34502005.6533170  

Time of Current Time Step = 0.537921191784371  

Time at the End of Current Time Step = 0.559240045256864 

Hier ist mein Code:

Nc = 5; 
textFilename = ['TimeStep-2.txt']; 
fid = fopen(textFilename); 

for k = 1:1 
    zero = sscanf(fid,'%f','Delimiter','\n'); 
end 

for k = (1+4):(1+(Nc-1)+4) 
    one = sscanf(fid,'%f %f %f %f %f',[5,inf]); 
end 

for k = (1+(Nc-1)+2*4):(1+2*(Nc-1)+2*4) 
    two = sscanf(fid,'%f %f %f %f %f',[5,inf]); 
end 

for k = (1+2*(Nc-1)+3*4):(1+3*(Nc-1)+3*4) 
    three = sscanf(fid,'%f %f %f',[3,inf]); 
end 

for k = (1+3*(Nc-1)+4*4):(1+4*(Nc-1)+4*4) 
    four = sscanf(fid,'%f %f',[2,inf]); 
end 

for k = (1+4*(Nc-1)+5*4):(1+5*(Nc-1)+5*4) 
    five = sscanf(fid,'%f %f',[2,inf]); 
end 

for k = (1+5*(Nc-1)+5*4+2):(1+5*(Nc-1)+5*4+2) 
    six = sscanf(fid,'%f','Delimiter','\n'); 
end 

for k = (1+5*(Nc-1)+5*4+2*2):(1+5*(Nc-1)+5*4+2*2) 
    seven = sscanf(fid,'%f','Delimiter','\n'); 
end 

fclose(fid); 
+0

Wo schlägt Ihr Code fehl? – codeaviator

+0

Fehler bei der Verwendung von sscanf "Zu viele Eingabeargumente" – FortranFun

+0

Warum verwenden Sie ein solches Datenformat? – Bernhard

Antwort

1

I verwendet fgetl einzelne Zeile zu einem Zeitpunkt, und dann strtrim und strsplit entfernen weißen Räumen zu lesen und Teile es auf. Schließlich konvertiert ich in Doppel:

% open text file 
fid = fopen('data.txt'); 
% initialize struct 
s = struct([]); 
% initialize loop variables 
incArrayIdx = false; % increment array index 
arrayIdx = 1; 
rowIdx = 1; 
% read single line from file (removing '\n') 
tline = fgetl(fid); 
while ischar(tline) % while is not EOF 
    % trim white space at the beginning of line 
    tline = strtrim(tline); 
    % split lines into cells by spaces(default delimiter) 
    C = strsplit(tline); 
    % convert each cell from string to double 
    A = cellfun(@str2double,C); 
    if any(isnan(A)) % nans come from non-numeric data 
     rowIdx = 1; % reset row index 
     if incArrayIdx % if need to increase array index 
      arrayIdx = arrayIdx + 1; 
      incArrayIdx = false; 
     end 
    else % didn't find nans - only numeric data 
     % next time you find nan increase array index 
     incArrayIdx = true; 
     % set new row in array 
     s(arrayIdx).data(rowIdx,:) = A; 
     % increase row idx 
     rowIdx = rowIdx + 1; 
    end 
    % read next line 
    tline = fgetl(fid); 
end 
% close file 
fclose(fid); 

und Sie erhalten:

{s.data}' = 

    5×1 cell array 

    [5×5 double] 
    [5×5 double] 
    [5×3 double] 
    [5×2 double] 
    [5×2 double] 

By the way, scheint es, dass Ihre drei letzten Matrizen nicht 5x5, vielleicht dies verursacht Sie die Probleme?

+0

Ihr Code ist hilfreich, aber ich möchte auch Wert aus der ersten Zeile und den letzten beiden Zeilen extrahieren. Drei sind drei einzelne Werte. – FortranFun

Verwandte Themen