简体   繁体   中英

Matlab: How can I read the number including decimal using `sscanf`?

I am trying to read the file with the following format which repeats itself (but I have cut out the data even for the first repetition because of it being too long):

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

This is the original file

In some of the data file I have there are days with decimal numbers. In that case I am just getting the number before the decimal and no decimals. I am using the code shown below to read and store. How can I include the decimal part as well in days ? For example I want the days to store 2.2 instead of just 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

Change line days(w) = sscanf(days_str, '%d'); to line days(w) = sscanf(days_str, '%f');

This got a bit longer than I was expecting. You might want to read in the file in a different way. The following code processes the file line by line, so that at the end of the while loop you have the daynum and its data laid out in allnums:

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM