2012-04-12 5 views
1

Ich versuche, die Datei mit folgendem Format zu lesen, die sich wiederholt (aber ich habe die Daten auch für die erste Wiederholung, weil es zu lang ausgeschnitten):Matlab: Wie kann ich mit `sscanf` die Zahl einschließlich dezimal lesen?

1.00 'day' 2011-01-02 
'Total Velocity Magnitude RC - Matrix' 'm/day' 
    0.190189  0.279141  0.452853  0.61355  0.757833  0.884577 
    0.994502  1.08952  1.17203  1.24442  1.30872  1.36653 
    1.41897  1.46675  1.51035  1.55003  1.58595  1.61824 

Dies ist die ursprüngliche file

In einigen der Datendatei habe ich Tage mit Dezimalzahlen. In diesem Fall erhalte ich nur die Zahl vor der Dezimalzahl und keine Dezimalstellen. Ich verwende den unten gezeigten Code zum Lesen und Speichern. Wie kann ich den Dezimalteil auch in days einfügen? Zum Beispiel möchte ich die days 2.2 anstatt zu speichern, nur 2.

fid = fopen(file_name); % open the file 

dotTXT_fileContents = textscan(fid,'%s','Delimiter','\n'); % read it as string ('%s') into one big array, row by row 
dotTXT_fileContents = dotTXT_fileContents{1}; 
fclose(fid); %# don't forget to close the file again 
% str2match = '''Total Velocity Magnitude RC - Matrix'' ''m/day'''; 

%# find rows containing 'Total Velocity Magnitude RC - Matrix' 'm/day' 
data_starts = strmatch(str2match,... 
    dotTXT_fileContents); % data_starts contains the line numbers wherever 'Total Velocity Magnitude RC - Matrix' 'm/day' is found 
nDataRows=data_starts(2)-data_starts(1); 
ndata = length(data_starts); % total no. of data values will be equal to the corresponding no. of '** K' read from the .txt file 

%# loop through the file and read the numeric data 
for w = 1:ndata 
    %# read lines containing numbers 
    tmp_str = dotTXT_fileContents(data_starts(w):data_starts(w)+nDataRows-2); % stores the content from file dotTXT_fileContents of the rows following the row containing 'Total Velocity Magnitude RC - Matrix' 'm/day' in form of string 
    %# convert strings to numbers 
    y = cell2mat(cellfun(@(z) sscanf(z,'%f'),tmp_str,'UniformOutput',false)); % store the content of the string which contains data in form of a character 
    %# assign output 
    data_matrix_column_wise(:,w) = y; % convert the part of the character containing data into number 

    %# reading date in days passed since beginning of simulation 
    days_str = dotTXT_fileContents(data_starts(w)-1); 
    days_str = days_str{1}; 
    days(w) = sscanf(days_str, '%d'); 
end 

Antwort

2

Linie ändern days(w) = sscanf(days_str, '%d'); Linie days(w) = sscanf(days_str, '%f');

1

Diese etwas länger bekam, als ich erwartet hatte. Vielleicht möchten Sie die Datei auf andere Weise einlesen. Der folgende Code verarbeitet die Datei Zeile für Zeile, so dass am Ende der while-Schleife Sie die daynum haben und ihre Daten in allnums gelegt:

filename = 'single_phase_flow.txt'; 
fid = fopen(filename); 

while 1 
    % first line: 1.00 'day' 2011-01-02 
    tline = fgetl(fid); 
    if ~ischar(tline), break, end; 
    strs = regexp(tline, '\s', 'split'); 

    daynum = sscanf(strs{1}, '%f'); 
    daystr = strs{2}; 
    datestr = strs{3}; 

    % second line: 'Total Velocity Magnitude RC - Matrix' 'm/day' 
    tline = fgetl(fid); 
    if ~ischar(tline), break, end; 
    if (~regexp(tline, 'Total Velocity')) 
     disp('expected Total Velocity line'); 
     break; 
    end 

    % now read in numbers until we get to a blank line 
    allnums = []; 
    gotline = 1; 
    while gotline 
     tline = fgetl(fid); 
     if ~ischar(tline) 
      gotline = NaN; 
     end 
     if (length(tline) == 0) 
      gotline = 0; 
     else 
      % read in more numbers (not especially efficient) 
      nums = sscanf(tline, '%f'); 
      allnums = [allnums; nums]; 
     end 
    end 

    % here is the data, you'll need to put it somewhere yourself now 
    disp(daynum); 
    disp(length(allnums)); 
end 

fclose(fid); 
Verwandte Themen