user6985
user6985

Reputation: 93

Read a value from multiple text files and write all into another file

I have a list of sub-folders and each sub-folder has a text file name called simass.txt. From each of the simass.txt files I extract a c{1}{2,3} cell data (as done in the code below) and write it to a file name features.txt in sequential form in single column.

I am facing a problem where at the end I only have a single value in features.txt, which I believe is due to the values being overwritten. I'm supposed to have 1000 values in features.txt since I have 1000 sub-folders.

What am I doing wrong?

clc;    % Clear the command window.
workspace;  % Make sure the workspace panel is showing.
format long g;
format compact;
% Define a starting folder wherever you want
start_path = fullfile(matlabroot, 'D:\Tools\Parameter Generation\');
% Ask user to confirm or change.
topLevelFolder = uigetdir(start_path);
if topLevelFolder == 0
  return;
end
% Get list of all subfolders.
allSubFolders = genpath(topLevelFolder);
% Parse into a cell array.
remain = allSubFolders;
listOfFolderNames = {};
while true
[singleSubFolder, remain] = strtok(remain, ';');
if isempty(singleSubFolder)
    break;
    end
listOfFolderNames = [listOfFolderNames singleSubFolder];
end
numberOfFolders = length(listOfFolderNames)
% Process all text files in those folders.
for k = 1 : numberOfFolders
% Get this folder and print it out.
thisFolder = listOfFolderNames{k};
fprintf('Processing folder %s\n', thisFolder);

% Get filenames of all TXT files.
filePattern = sprintf('%s/simass.txt', thisFolder);
baseFileNames = dir(filePattern);
numberOfFiles = length(baseFileNames);
% Now we have a list of all text files in this folder.

if numberOfFiles >= 1
    % Go through all those text files.
    for f = 1 : numberOfFiles
        fullFileName = fullfile(thisFolder, baseFileNames(f).name);
      fileID=fopen(fullFileName);
      c=textscan(fileID,'%s%s%s','Headerlines',10,'Collectoutput',true);
      fclose(fileID);
      %celldisp(c)   % display all cell values
      cellvalue=c{1}{2,3} 
      filePh = fopen('features.txt','w');
      fprintf(filePh,cellvalue);
      fclose(filePh);
        fprintf('     Processing text file %s\n', fullFileName);
    end
else
    fprintf('     Folder %s has no text files in it.\n', thisFolder);
end
end

Upvotes: 0

Views: 48

Answers (1)

Dev-iL
Dev-iL

Reputation: 24159

The problem is in the permission you use in fopen. From the documentation:

'w' - Open or create new file for writing. Discard existing contents, if any.

Which means you're discarding the contents every time, and you end up only having the last value. The fastest fix would be changing the permission to 'a', but I would suggest adding some changes to the code as follows:

  1. Creating cellvalue before the loop, and read c{1}{2,3} into this new vector/cell array.
  2. Perform the writing operation once, after cellvalue is fully populated.

cellvalue = cell(numberOfFiles,1);
for f = 1 : numberOfFiles
    ...
    cellvalue{f} = c{1}{2,3};
end
fopen(...);
fprintf(...);
fclose(...);

Upvotes: 4

Related Questions