How to read and write multiple .txt files with unpatterned names into a table?

5 views (last 30 days)
Hi everyone,
I have a multiple .txt files (31) each containing 4 columns with headers and 2000 rows.
What I am trying to do is, to import the first 1000 column for each file and combine them into a table by horizontal concatenation and do the same for the second 1000 column to obtain a second table than write them into 2 separate excel files.
I have read most of the related headers but it seems a bit challenging to manage the files with unpatterned names. I have attached a couple of the .txt files for an example.
I used the "generate function" from the import tool which works fine, but does the job for only a single .txt file. Is it possible to insert a loop into this auto generated function? Or is there a simpler way?
function mA = importfile1(filename, dataLines)
%IMPORTFILE1 Import data from a text file
% MA = IMPORTFILE1(FILENAME) reads data from text file FILENAME for the
% default selection. Returns the data as a table.
%
% MA = IMPORTFILE1(FILE, DATALINES) reads data for the specified row
% interval(s) of text file FILENAME. Specify DATALINES as a positive
% scalar integer or a N-by-2 array of positive scalar integers for
% dis-contiguous row intervals.
%
% Example:
% mA = importfile1("C:\Users\uzumcu\Desktop\MatlabDrive\QCL measurements\22-06-20\1726 RG 2.2 SG 2 Current\400mA.txt", [2, 1002]);
%
% See also READTABLE.
%
% Auto-generated by MATLAB on 30-Jun-2020 17:33:31
%% Input handling
% If dataLines is not specified, define defaults
if nargin < 2
dataLines = [2, Inf];
end
%% Setup the Import Options and import the data
opts = delimitedTextImportOptions("NumVariables", 4);
% Specify range and delimiter
opts.DataLines = dataLines;
opts.Delimiter = "\t";
% Specify column names and types
opts.VariableNames = ["PointsReference", "AmplitudeReference", "PointsSample", "AmplitudeSample"];
opts.VariableTypes = ["double", "double", "double", "double"];
% Specify file level properties
opts.ExtraColumnsRule = "ignore";
opts.EmptyLineRule = "read";
% Import the data
mA = readtable(filename, opts);
end
Any help could be really appreciated since I am trying to figure this out for 3 days.
Thank you all in advance

Answers (1)

Steven Lord
Steven Lord on 30 Jun 2020
Generate a list of the files you want to import. There are a number of different tools you can use to do this; since you say the file names are "unpatterned" the dir function will probably be the most useful as it will give a list of all files in the directory.
Create a combined table with the right number of variables and give those variables the correct names. Write a loop that iterates over the list of files. In the body of the loop call this generated function for the file to get the table for that file then append it to the combined table using concatenation ([A; B]), join, etc.
  2 Comments
AHMET TALHA UZUMCU
AHMET TALHA UZUMCU on 3 Jul 2020
Hi again,
thank you for the hints.
I have just created the variable "Names_of_Files" in order to get the names for each .txt file.
Files = dir("*.txt");
Filesinfo = struct2table(Files);
Names_of_Files = (Filesinfo.name)';
I have also created a template table :
for i = 1: length(Names_of_Files)
importfile(Names_of_Files(i))
end
when I try to loop over the files in my directory by using the auto generated function, I receive the error,
File input must be a non-empty character vector or string scalar.
Error in importfile (line 47)
mA = readtable(filename, opts);"
what part I am missing?
Thank you.
AHMET TALHA UZUMCU
AHMET TALHA UZUMCU on 3 Jul 2020
Hello again. I think I have achieved to put all the txt. files as table into a cell array.
Files = dir("*.txt"); % finds all the .txt in the directory.
Filesinfo = struct2table(Files);
Names_of_Files = (Filesinfo.name)'; % listing their names for looping
num_of_files = length(Names_of_Files);
Q = cell([1,31]); % Creating a cell array for preallocation
for i = 1:num_of_files
Q{i} = importfile(Names_of_Files{i},[2,1002]); % looping by using the generated function as suggested.
end
Now I have a cell which contains all the txt. files as a table. The next step is to add them horizontally so that I obtain a large table to be written into an Excel file.
But somehow writecell function does not work.
thank you in advance.

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!