首页 文章

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

提问于
浏览
2

我有一个非常大的数据集,分为文件夹,我有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

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

    % 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] .

相关问题