Read text file into matlab
    108 views (last 30 days)
  
       Show older comments
    
Hi, I am using the following command to read the text file into matlab.
s=importdata('file.txt');
data=s.data;
text=s.textdata;
colheaders=s.colheaders;
Its working for large data sets. But, its not working for small data sets where I have only 30 data points after the text ends. Can you let me know how to fix it ?
Even its failing to read the attached file. See text file attached.
Thanks.
0 Comments
Answers (2)
  bim
 on 25 Dec 2022
        
      Edited: bim
 on 25 Dec 2022
  
      I have been using importdata for textfiles, but it is very slow for text unless you rename all the files to '.txt'.
The function below seems to do the job for structured text files with headerlines specifying nRows and nColumns.
The structure the function can handle is shown at the bottom the function: it only works for tables of float numbers
Let me know whether this works well.
%% READTEXTFILE reads text files without any checks
%  READTEXTFILE reads from file and immediately  filters out the selectColumns
%  READTEXTFILE can read any number of headerlines, but
%  the headerlines must contain both nRows='a number' and 'nColumns=a number' in separate lines
%  the lines containing nRows and nColumns must not contain any spaces
%
%  parameter filename = if the selected file is not a text file, the function will fail
%  the extension of the filename is ignored and does not need to be present
%  parameter selectedcolumns = header names of columns to be selected from the file
%  e.g., selectedcolumns = {'time', 'column_3'}
%
%  The read data is returned in a struct c
%  content.data = the actual data as a matrix
%  content.colheaders = the headers of the remaining columns
%  content.colheaders == selectedcolumns
%  content.textdata == content.colheaders
%  
function content=readtextfile(varargin) % filename,selectedcolumns
    tic
    selectedcolumns={};
    if nargin>2 || nargin ==0
        error('readtextfile: too many or too few arguments');
    elseif nargin ==2
        selectedcolumns=varargin{2};
    end
    filename=varargin{1};
    fid = fopen(filename,'rt');
    file.title = fgetl(fid);
    file.nrows=string([]);
    file.ncolumns=string([]);
    line = string(fgetl(fid));
    while line ~= "endheader"
        if length(file.nrows)==0
            file.nrows=regexp(line,'^nRows=(?<nrows>\d+)$','tokens','once');
        end
        if length(file.ncolumns)==0
            file.ncolumns=regexp(line,'^nColumns=(?<ncolumns>\d+)$','tokens','once');
        end
        line = string(fgetl(fid));
    end
    file.nrows=str2num(file.nrows);
    file.ncolumns=str2num(file.ncolumns);
    fsColHeaders = repmat([' %s'],1,file.ncolumns);
    colHeaders = textscan(fid,fsColHeaders,1,'EndOfLine','\r\n','MultipleDelimsAsOne',1); % 3rd param (N) == 1 --> read once
    fsData = repmat([' %f'],1,file.ncolumns);
    fileData = textscan(fid,fsData,'EndOfLine','\r\n','MultipleDelimsAsOne',1); % 3rd param (N) missing --> read until end of file
    colHeaders =cellfun(@char,colHeaders,'UniformOutput',false);
    [~,copiedColumns] = ismember(selectedcolumns,colHeaders);
    if length(copiedColumns)>0
        newMatrix= zeros(file.nrows,nnz(copiedColumns));
        iNewColumns=1;
        for iCopiedColumns = copiedColumns
            if iCopiedColumns>0
                newMatrix(:,iNewColumns) = fileData{iCopiedColumns};
                % newHeaders is not necessary, since it corresponds to selectedcolumns
                % but it is is helpful in checking proper operation of the function
                newHeaders(:,iNewColumns) = colHeaders(iCopiedColumns);
                iNewColumns=iNewColumns+1;
            end
        end
    else
         newMatrix = cell2mat(fileData);
         newHeaders = colHeaders;
    end
    fclose(fid);
    content.data = newMatrix;
    content.textdata = newHeaders;
    content.colheaders = newHeaders;
    toc
end
% example of possible headerlines
%{
the title
nRows=437
nColumns=17
any number of lines
endheader
time	column_1    column_2    column_3 ...
0.001   0.1234      0.3456      0.7891
0.002   0.2234      0.4456      0.8891
%}
0 Comments
See Also
Categories
				Find more on Workspace Variables and MAT Files in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


