如何在Matlab中导入和保存多个文本文件,为每个文件创建一个Matrix

时间:2014-11-25 10:11:46

标签: matlab file text import

我有一个非常大的数据集,它被分成文件夹,我有100个文件夹,每个文件夹大约有200个文本文件。我一直在尝试for循环首先导入一个然后在另一个命令导入其余的。但我对数据阵列不感兴趣,而是保留每个文件的名称,因为我必须匹配所有文件中的日期,每个文件的列数不同。

每个文本文件都与我附加的文件一样,我需要的数据是从第23行到第13列。

数据名称保存为010010.txt,010030.txt,010050.txt ......直到014957.txt,它们不是顺序的

除此之外,我创建了一个用于导入一个文件的脚本,但我想知道如何为其余文件重复相同的脚本。

filename = 'C:*\010010.txt';

startRow = 22;

formatSpec = '%4f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%[^\n\r]';

fileID = fopen(filename,'r');

dataArray = textscan(fileID, formatSpec, 'Delimiter', '', 'WhiteSpace', '', 'HeaderLines' ,startRow-1, 'ReturnOnError', false);

fclose(fileID);

Untitled (010010) = [dataArray{1:end-1}];

我想重复相同的导入过程,但是对于其余文件。我将不胜感激任何建议

文本文件格式如下:

我只需要从第23行和第13列开始,每个txt文件都有不同的行数,因为有些数据来自1992 - 2014年,其他只有2000 - 2014年。第一列是年份,第2列到第13列是月份

1 个答案:

答案 0 :(得分:0)

我猜您知道所有文件夹所在的基本路径。然后你可以使用这样的东西:

% First find all folders
folders = cell(0);                              % empty cell to save folder names
nFolders = 0;
allFolders = ls(basePath);                      % find all files and folders
for k=1:size(allFolders,1)
    curFolder = fullfile(basePath,strtrim(allFolders(k,:)));
    if isdir(curFolder)                         % find out if it is a folder
        if ~(allFolders(k,1) == '.')            % ignore '.' and '..'
            folders{nFolders+1,1} = curFolder;  % Save folder path
            nFolders = nFolders + 1;         
        end
    end
end

% Then find all files inside these folders
files = cell(0);                               % empty cell array for file names
nFiles = 0;
for k=1:nFolders                               % go through all folders
    allFiles = ls(folders{k,1});
    for l=1:size(allFiles,1)                   % go through all found files/subfolders
        curFile = fullfile(folders{k},strtrim(allFiles(l,:)));
        if ~isdir(curFile)                     % only select files
            files{nFiles+1,1} = curFile;       % and save it to the cell
            nFiles = nFiles + 1;
        end
    end
end

现在,您可以遍历files单元格并根据您的脚本读取所有文件。我看到你对文件名感兴趣。您可以通过

提取文件名
[path,filename,extension] = fileparts(files{k,1});

要导入文本文件,您可以使用dlmread,我认为这比textscan更直观(但当然有更多限制)。为此,您不必使用fopen打开文件,您可以直接提供文件名。

value = dlmread(fileName,' ',[23,13,23,13]);

分隔符现在是一个空格,只读取row = 23 / col = 13的值。请注意,范围从row / col = 0开始,而不是像Matlab中通常那样1 - 所以也许你必须将它改为[22,12,22,12]